Purpose

Can weather data help predict costs associated with routes?

Database Connections

DuckDB

Establish a DuckDB, embedded database connection.
duckdb_con <- dbConnect(duckdb::duckdb(
     config = list(max_memory = '24GB')), ":memory:")

Loading Custom Output Scripts

Tables

table building
# Table Theming Script ----
#' @description
#' This script provides functions to create and theme tables using the `gt` package.
#' It includes options for customizing colors, footnotes, and other stylistic elements.
#' 
# eval_palette ----
#' @description
#' A helper function to evaluate color palettes using the `paletteer` package.
#' @param pal_name The name of the palette to evaluate.
#' @param n The number of colors to generate (default is 10).
#' @param pal_type The type of palette ("c" for continuous, "d" for discrete, or "dynamic" for dynamic palettes).
#' @param direction The direction of the palette (e.g., 1 for normal, -1 for reversed).
#' 
#' @return A vector of colors corresponding to the specified palette.
#' 
#' @example
#' \dontrun{
#' colors <- eval_palette("ggsci::springfield_simpsons", n = 5, pal_type = "d")
#' }
#' @export 
eval_palette <- function(pal_name, n = 10, pal_type, direction = NULL) {
     if (pal_type == "c") {
          return(paletteer_c(pal_name, n, direction))
     } else if (pal_type == "d") {
          return(paletteer_d(pal_name, n, direction))
     } else if (pal_type == "dynamic") {
          return(paletteer_dynamic(pal_name, n, direction))
     }
}

# r_table_theming ----
#' @description
#' The main function to create and theme a table using the `gt` package.
#' @details
#' **Color Coding** Applies color palettes to specific columns or the entire table.
#' **Footnotes** Adds footnotes to specific columns or locations in the table.
#' **Column Labels** Customizes the appearance of column labels, including background colors.
#' **Table Styling** Applies various styling options, such as borders, padding, and font weights.
#' **Shadow Effects** Optionally adds shadow effects to table body cells.
#'
#' @param r_df The data frame to be converted into a table.
#' @param title The title of the table.
#' @param subtitle The subtitle of the table.
#' @param footnotes_df A data frame containing footnotes and their locations.
#' @param source_note A source note to be added at the bottom of the table.
#' @param pal_df A data frame containing color palettes and columns to apply them to.
#' @param color_by_columns Columns to apply color to (default is NULL).
#' @param row_name_col The column to use as row names (default is NULL).
#' @param do_col_labels Whether to apply custom styling to column labels (default is FALSE).
#' @param target_everything Whether to apply color to all columns (default is FALSE).
#' @param doBodyShadows Whether to apply shadow effects to table body cells (default is FALSE).
#'
#' @return A themed `gt` table object.
#' 
#' @example 
#' \dontrun{
#'   data <- data.frame(
#'     Name = c("Alice", "Bob", "Charlie"),
#'     Score = c(85, 92, 78)
#'   )
#'   pal_df <- data.frame(
#'     cols = list("Score"),
#'     pals = list(eval_palette("ggsci::springfield_simpsons", n = 3, pal_type = "d"))
#'   )
#'   footnotes_df <- data.frame(
#'     notes = list("High score"),
#'     locations = list("Score")
#'   )
#'   themed_table <- r_table_theming(
#'     r_df = data,
#'     title = "Student Scores",
#'     subtitle = "Fall 2023",
#'     footnotes_df = footnotes_df,
#'     source_note = "Source: School Records",
#'     pal_df = pal_df,
#'     do_col_labels = TRUE
#'   )
#'   themed_table
#'  }
#'  
# r_table_theming ----
# Main function to create and theme a table using the `gt` package.
#' @export
r_table_theming <- function(r_df,
                            title,
                            subtitle,
                            footnotes_df,
                            source_note,
                            pal_df,
                            color_by_columns = NULL,
                            row_name_col = NULL,
                            do_col_labels = FALSE,
                            target_everything = FALSE,
                            doBodyShadows = FALSE,
                            footnotes_multiline = TRUE,
                            table_font_size = pct(100),
                            multiline_feet = TRUE
                            ) {
     # Initialize the gt table
     if(is.null(row_name_col)) {
          # If no row name column is specified, create a basic gt table
          r_table <- gt(r_df)
     } else {
          # If a row name column is specified, use it as the row names in the table
          r_table <- gt(r_df, rowname_col = row_name_col)
     }
     
     # Apply color coding to specific columns or the entire table
     if (nrow(r_df) > 1 && target_everything == FALSE) {
          # Apply color palettes to specific columns defined in pal_df
          r_table <- seq_len(nrow(pal_df)) |>
               reduce(\(acc, i) {
                    data_color(acc,
                               columns = pal_df$cols[[i]],  # Apply color to specified columns
                               palette = pal_df$pals[[i]]   # Use the specified palette
                    )
               }, .init = r_table)  # Start with the initial table and accumulate changes
     }
     else if (nrow(r_df) > 1 && target_everything == TRUE) {
          # Apply color palettes to all columns
          r_table <- seq_len(nrow(pal_df)) |>
               reduce(\(acc, i) {
                    data_color(
                         acc,
                         columns = color_by_columns,  # Apply color to specified columns
                         palette = pal_df$pals[[i]],  # Use the specified palette
                         target_columns = everything()  # Apply color to all columns
                    )
               }, .init = r_table)  # Start with the initial table and accumulate changes
     }
     
     # Add footnotes to the table
     r_table <- seq_len(nrow(footnotes_df)) |>
          reduce(\(acc, i) {
               tab_footnote(
                    acc,
                    footnote = footnotes_df$notes[[i]],  # Add the footnote text
                    location = cells_column_labels(
                         columns = footnotes_df$locations[[i]]),  # Specify the column for the footnote
                    placement = "auto"  # Automatically place the footnote
               )
          }, .init = r_table)  # Start with the initial table and accumulate changes
     
     # Apply custom styling to column labels (if enabled)
     if (ncol(r_df) > 1 && do_col_labels == TRUE) {
          cell_col_fills = pal_df$pals[[1]]  # Get the first palette for column labels
          # Apply background colors to column labels
          r_table <- seq_len(nrow(pal_df)) |>
               reduce(\(acc, i) {
                    tab_style(
                         acc,
                         style = cell_fill(color = cell_col_fills[i]),  # Fill column labels with color
                         locations = cells_column_labels(
                              columns = pal_df$cols[[i]])  # Apply to specified columns
                    )
               }, .init = r_table)  # Start with the initial table and accumulate changes
     }
     
     # Add a title and subtitle to the table
     r_table <- r_table |>
          tab_header(title = title, subtitle = subtitle)
     
     # Add a source note at the bottom of the table
     r_table <- r_table |>
          tab_source_note(source_note = source_note)
     
     # Apply general table styling options
     r_table <- r_table |>
          tab_options(
               column_labels.padding = px(10),  # Add padding to column labels
               column_labels.font.weight = "bold",  # Make column labels bold
               column_labels.background.color = '#333',  # Set background color for column labels
               column_labels.border.top.width = px(0),  # Remove top border for column labels
               column_labels.border.bottom.color = 'black',  # Set bottom border color for column labels
               column_labels.vlines.width = px(1),  # Set vertical line width for column labels
               column_labels.border.lr.width = px(1),  # Set left/right border width for column labels
               column_labels.border.bottom.width = px(0),  # Remove bottom border for column labels
               column_labels.border.lr.color = 'black',  # Set left/right border color for column labels
               column_labels.vlines.color = 'black',  # Set vertical line color for column labels
               footnotes.padding = px(5),  # Add padding to footnotes
               footnotes.background.color = '#222',  # Set background color for footnotes
               footnotes.sep = ", ",  # Set separator for footnotes
               footnotes.multiline = footnotes_multiline,  # Allow multiline footnotes (if enabled)
               heading.padding = px(10),  # Add padding to the heading
               heading.background.color = '#222',  # Set background color for the heading
               heading.title.font.size = pct(125),  # Set font size for the title
               heading.subtitle.font.size = pct(110),  # Set font size for the subtitle
               heading.border.bottom.width = px(0),  # Remove bottom border for the heading
               row.striping.include_table_body = TRUE,  # Enable row striping for the table body
               row.striping.include_stub = TRUE,  # Enable row striping for the stub
               row.striping.background_color = '#333',  # Set background color for striped rows
               row_group.as_column = TRUE,  # Display row groups as columns
               source_notes.background.color = '#222',  # Set background color for source notes
               stub.border.width = px(0),  # Remove border for the stub
               stub.font.weight = "bolder",  # Make stub text bolder
               table.margin.left = px(1),  # Set left margin for the table
               table.margin.right = px(1),  # Set right margin for the table
               table.align = "center",  # Center-align the table
               table.border.top.width = px(0),  # Remove top border for the table
               table.border.bottom.width = px(0),  # Remove bottom border for the table
               table.background.color = '#222',  # Set background color for the table
               table.font.size = table_font_size,  # Set font size for the table
               table.layout = "auto",  # Use automatic table layout
               table_body.hlines.color = 'black',  # Set horizontal line color for the table body
               table_body.hlines.width = px(0),  # Remove horizontal lines in the table body
               table_body.vlines.width = px(0),  # Remove vertical lines in the table body
               table_body.border.bottom.color = 'black',  # Set bottom border color for the table body
               table_body.border.top.color = 'black',  # Set top border color for the table body
               table_body.border.bottom.width = px(0),  # Remove bottom border for the table body
               table_body.border.top.width = px(0),  # Remove top border for the table body
          )
     
     return(r_table)
}

Plots

plot theming
#  Plot output script ----
# normal axes ----
ggplot_theming <- function(...) {
     base_theme <- theme_minimal() +
          theme(
               axis.title = element_text(
                    color = 'gray100',
                    margin = margin(5, 5, 5, 5, "pt")
               ),
               axis.title.x = element_text(margin = margin(10, 10, 10, 10, "pt"), face = "bold"),
               axis.title.y = element_text(
                    face = "bold",
                    size = rel(1),
                    margin = margin(5, 5, 5, 5, "pt")
               ),
               axis.text = element_text(color = 'gray', margin = margin(5, 5, 5, 5, "pt")),
               axis.text.x = element_text(),
               axis.text.y = element_text(margin = margin(0, 5, 0, 5, "pt")),
               axis.text.x.top = element_text(vjust = 0.5),
               line = element_line(color = '#222'),
               legend.background = element_rect(fill = '#222'),
               legend.position = "bottom",
               legend.text = element_text(color = 'gray', size = rel(0.7)),
               legend.title = element_text(color = 'white', size = rel(1.0)),
               panel.background = element_rect(fill = '#222',
                                               linewidth = 0),
               panel.grid.major.x = element_line(linetype = 'solid', color = 'black'),
               panel.grid.minor.x = element_line(linetype = "dotted", color = 'black'),
               panel.grid.major.y = element_line(
                    linetype = 'solid',
                    color = 'black',
                    linewidth = .2
               ),
               panel.grid.minor.y = element_line(linetype = 'dotted', color = 'black'),
               plot.title = element_text(
                    face = "bold",
                    color = 'white',
                    size = rel(1.5)
               ),
               plot.background = element_rect(fill = '#222',
                                              linewidth = 0),
               plot.caption = element_text(
                    size = 10,
                    color = "gray80",
                    margin = margin(5, 2, 5, 2),
                    hjust = 0
               ),
               plot.margin = margin(10, 10, 10, 10, "pt"),
               strip.background = element_rect(fill = 'gray20'),
               strip.text = element_text(size = rel(0.8), 
                                         margin = margin(0, 0, 0, 0, "pt"),
                                         color = 'cornsilk'),
               #strip.text.y = element_text(color = "black"),
              # strip.text.x = element_text(color = "ivory", face = "plain"),
               text = element_text(size = 12)
          )
     
     base_theme + theme(...)
}

# flipped axes ----
ggplot_theming_flipped_axes <- function(...) {
     base_theme <- theme_minimal() +
          theme(
               axis.title = element_text(color = 'gray100'),
               axis.text = element_text(color = 'gray'),
               panel.background = element_rect(fill = '#222'),
               panel.grid.major.x = element_line(linetype = 'dashed'),
               panel.grid.minor.x = element_line(linetype = "dotted"),
               panel.grid.major.y = element_line(linetype = 'solid'),
               panel.grid.minor.y = element_line(linetype = 'dotted'),
               plot.title = element_text(color = 'white', size = rel(2)),
               plot.background = element_rect(fill = '#222'),
               legend.background = element_rect(fill = '#222'),
               legend.text = element_text(color = 'gray'),
               legend.title = element_text(color = 'white')
          )
     
     base_theme + theme(...)
     
}
plot building
# Load necessary libraries
library(DBI)          # For database connectivity
library(ggplot2)      # For creating plots
library(scales)       # For scaling and formatting axes
library(openair)      # For specialized plots like wind roses
source("./scripts/Output/Plots/plot_themer.R")  # Custom theme for ggplot

# Helper function to execute a query and return the result
execute_query <- function(con, query) {
     dbGetQuery(con, query)  # Execute the SQL query and return the result
}


plot_temperature_trend <- function(con, freezing_threshold = 32) {
     # Query to fetch temperature data for the day
     query <- "
    SELECT
      temperature_2m,
      time_only,
      common_date,
      month_day
    FROM
      forecast_data
    WHERE
      latitude = 38.748;
  "
     
     data <- execute_query(con, query)  # Execute the query and get the data
     
     # Calculate bar width based on time intervals
     if (nrow(data) > 1) {
          time_diff <- as.numeric(difftime(data$common_date[2], data$common_date[1], units = "secs"))
     } else {
          time_diff <- 3600  # Default to 1 hour if only one data point
     }
     half_width <- time_diff / 2
     
     # Prepare data for rectangular columns
     data <- data %>%
          arrange(common_date) %>%
          mutate(
               xmin = common_date - half_width,
               xmax = common_date + half_width,
               fill_group = ifelse(temperature_2m > freezing_threshold, "above freezing", "below freezing"),
               ymin = ifelse(temperature_2m > freezing_threshold, freezing_threshold, temperature_2m),
               ymax = ifelse(temperature_2m > freezing_threshold, temperature_2m, freezing_threshold)
          )
     
     # Create a ggplot object for temperature trend
     rPlot <- ggplot(data, aes(x = common_date, y = temperature_2m)) +
          geom_rect(
               aes(
                    xmin = xmin,
                    xmax = xmax,
                    ymin = ymin,
                    ymax = ymax,
                    fill = fill_group
               ),
               color = 'black',
               alpha = 0.5
          ) +  # Column rectangles
     #     geom_line(color = "black", size = 0.5) +  # Line plot for temperature
          geom_hline(
               yintercept = freezing_threshold,
               linetype = "dashed",
               color = "lightblue",
               linewidth = 0.4
          ) +  # Horizontal line for freezing threshold
          labs(
               title = "Temperature Forecast",
               x = "",
               y = "° F"
          ) +  # Labels for the plot
          scale_x_datetime(
               labels = label_date("%l %p"),
               breaks = "6 hours",
               minor_breaks = "2 hours",
               guide = guide_axis(n.dodge = 1)
          ) +  # Format x-axis for time
          scale_y_continuous(sec.axis = dup_axis(name = "")) +  # Secondary y-axis
          scale_fill_manual(
               name = "Freezing Indicators",
               values = c(
                    "above freezing" = "green",
                    "below freezing" = "lightblue"
               )
          ) +  # Manual color scale
          facet_grid(~ month_day) +  # Facet by month_day
          ggplot_theming()  # Apply custom theme
     
     # Save the plot as a PNG file
     base_path <- "data/plots/"
     plot_path <- paste0(base_path, "ggTemperature.png")
     ggsave(plot_path, plot = rPlot, scale = 1.5)
     
     # Read the PNG file and display it
     img <- readPNG(plot_path)
     grid::grid.raster(img)
}

# Precipitation and Probability ----
plot_precipitation <- function(con) {
     # Query to fetch precipitation data
     query <- "
    SELECT
      precipitation_probability,
      precipitation,
      rain,
      snowfall,
      time_only,
      common_date,
      month_day
    FROM
      forecast_data
    WHERE
      latitude = 38.748;
  "
     
     data <- execute_query(con, query)  # Execute the query and get the data
     
     # Calculate scale factor for secondary y-axis
     scale_factor <- max(data$precipitation_probability, 
                         na.rm = TRUE) / max(data$rain, 
                                             data$snowfall, na.rm = TRUE)
     
     # Create a ggplot object for precipitation
     rPlot <- ggplot(data, aes(x = as.POSIXct(common_date))) +
          geom_area(
               aes(y = precipitation_probability, fill = "Precipitation Probability"),
               #position = "jitter"
               linewidth = 0.2
          ) +  # Area plot for precipitation probability
          geom_col(
               aes(y = rain * scale_factor, fill = "Rain (in.)"),
               #size = 1,
               alpha = 0.3,
               position = "stack",
               #linetype = "dashed"
          ) +  # Line plot for rain
          geom_col(
               aes(y = snowfall * scale_factor, fill = "Snowfall (in.)"),
               #size = 1,
               alpha = 0.3,
               position = "stack",
               #linetype = "dotted"
          ) +  # Line plot for snowfall
          scale_y_continuous(
               name = "Precipitation Probability (%)",
               sec.axis = sec_axis( ~ . / ifelse(
                    is.infinite(scale_factor), 1000, scale_factor
               ), name = "Rain / Snowfall (inches)")
          ) +  # Dual y-axes
          scale_x_datetime(
               labels = scales::date_format("%H:%M"),
               breaks = "6 hours",
               minor_breaks = "2 hour",
               guide = guide_axis(n.dodge = 1)
          ) +  # Format x-axis for time
          scale_fill_manual(
               name = "Weather Condition",
               values = c(
                    "Rain (in.)" = "skyblue",
                    "Snowfall (in.)" = "snow"
               )
          ) +  # Manual color scale for weather conditions
          scale_fill_manual(
               name = "Precipitation\n and Probability",  # Single legend title
               values = c(
                    "Rain (in.)" = "skyblue", 
                    "Snowfall (in.)" = "snow", 
                    "Precipitation Probability" = "gray20"
               )) +
               labs(title = "Precipitation Forecast", 
               x = "Time of Day", 
               y = "Precipitation Probability (%)") +  # Labels for the plot
          facet_grid(~ month_day) +  # Facet by month_day
          ggplot_theming(legend.position = "bottom", 
                         legend.text = element_text(size = rel(0.5)),
                         legend.title = element_text(size = rel(0.7)))  # Apply custom theme
     
     # Save the plot as a PNG file
     base_path <- "data/plots/"
     plot_path <- paste0(base_path, "ggPrecipitation.png")
     ggsave(plot_path, plot = rPlot, scale = 1.5)
     
     # Read the PNG file and display it
     img <- readPNG(plot_path)
     grid::grid.raster(img)
     
}

# OpenAir Wind Rose ----
plot_wind_rose <- function(con) {
     # Query to fetch wind data
     query <- "
    SELECT
      wind_speed_10m,
      wind_direction_10m,
      time_only,
      common_date,
      month_day
    FROM
      forecast_data
    WHERE
      latitude = 38.748;
  "
     
     data <- execute_query(con, query)  # Execute the query and get the data
     
     # Create a wind rose plot using the openair package
     windRose(
          data,
          ws = "wind_speed_10m",
          wd = "wind_direction_10m",
          breaks = 5,
          paddle = TRUE,
          cols = paletteer_d("ggsci::springfield_simpsons", n = 3),
          key.position = "left"
     )
}

# ggplot wind rose ----
plot_wind_rose_ggplot <- function(con) {
     # Query to fetch wind data
     query <- "
       SELECT
         wind_direction_10m,
         speed_bin,
         wind_direction_cardinal,
         direction_angle,
         time_only,
         month_day
       FROM forecast_data
       WHERE
         latitude = 38.748;
     "
     
     data <- execute_query(con, query)  # Execute the query and get the data
     
     # Summarize data for plotting
     plot_data <- data |>
          group_by(wind_direction_10m, speed_bin, month_day, time_only) |>
          dplyr::summarise(count = n(), .groups = "drop")
     
     # Get unique days
     days <- unique(plot_data$month_day)
     
     walk(days, ~ {
          # Filter data for the current day
          day_data <- filter(plot_data, month_day == .x)
          
          # Create the wind rose plot for the current day
          day_plot <- ggplot(day_data,
                             aes(
                                  x = wind_direction_10m, y = count, fill = speed_bin
                             )) +
               geom_col(width = 15,
                        color = "black",
                        linewidth = 0.1) +
               coord_polar(start = 2 * pi) +
               scale_x_continuous(
                    limits = c(0, 360),
                    breaks = seq(22.5, 360, by = 22.5),
                    labels = c(' ', 'NE', ' ', 'E', ' ', 'SE', ' ', 'S', ' ','SW', ' ', 'W', ' ', 'NW', ' ', 'N')  # Cardinal labels
               ) +
               scale_fill_paletteer_d('ggprism::viridis') +
               labs(
                    title = paste("Wind Rose -", .x),
                    x = "Wind Direction (°)",
                    y = "",
                    fill = "Wind Speed (m/s)"
               ) +
               facet_wrap( ~ time_only) +  # Facet by hour
               ggplot_theming(
                    text = element_text(size = 8),
                    axis.text = element_text(
                         color = 'gray',
                         margin = margin(5, 5, 5, 5, "pt"),
                         size = rel(.8)
                    ),
                    axis.text.y = element_blank(),
                    strip.background = element_rect(fill = 'gray20'),
                    #strip.background.y = element_rect('#39D94E'),
                    strip.text = element_text(size = rel(0.8), 
                                              margin = margin(0, 0, 0, 0, "pt"),
                                              color = 'cornsilk'),
                    
               )
          
          # Save the plot for the current day
          ggsave(
               stringr::str_remove(paste0("data/plots/wind_rose_", .x, ".png"), " "),
               day_plot,
               #width = 24,
               #height = 20,
               scale = 2
          )
     })
     
     }


# Visibility geom_line ----
plot_visibility_line <- function(con) {
     # Query to fetch visibility data
     query <- "
    SELECT
      visibility,
      common_date,
      month_day
    FROM
      forecast_data
    WHERE
      latitude = 38.748;
  "
     
     data <- execute_query(con, query)  # Execute the query and get the data
     
     # Create a ggplot object for visibility trend
     rPlot <- ggplot(data, aes(x = common_date, y = visibility / 10 ^ 3)) +
          geom_line(color = "white", size = 0.5) +  # Line plot for visibility
          geom_point(color = "gray", alpha = 1) +  # Points for visibility
          labs(title = "Visibility Map", x = "Date", y = "Visibility (km)") +  # Labels for the plot
          scale_x_datetime(
               labels = scales::date_format("%H:%M"),
               breaks = "6 hours",
               minor_breaks = "2 hour",
               guide = guide_axis(n.dodge = 1)
          ) +  # Format x-axis for time
          facet_grid(~ month_day) +  # Facet by month_day
          ggplot_theming()  # Apply custom theme
     
     # Save the plot as a PNG file
     base_path <- "data/plots/"
     plot_path <- paste0(base_path, "ggVisibilityLine.png")
     ggsave(plot_path, plot = rPlot, scale = 1.5)
     
     # Read the PNG file and display it
     img <- readPNG(plot_path)
     grid::grid.raster(img)
     
}

# Visibility Non-Categorical Heat ----
plot_visibility_heat <- function(con) {
     # Query to fetch visibility data
     query <- "
    SELECT
      visibility,
      common_date,
      time_only,
      month_day
    FROM
      forecast_data
    WHERE
      latitude = 38.748;
  "
     
     data <- execute_query(con, query)  # Execute the query and get the data
     data$time_only <- as.POSIXct(data$time_only, format = "%H:%M:%S")
     
     # Create a ggplot object for visibility heatmap
     rPlot <- ggplot(data, aes(
          x = month_day,
          y = time_only,
          fill = visibility / 10 ^ 3
     )) +
          geom_tile() +  # Tile plot for visibility
          scale_fill_viridis_c(option = "magma") +  # Color scale for visibility
          labs(
               title = "Visibility (km)",
               x = "Time of Day",
               y = "Date",
               fill = "Visibility (km)"
          ) +  # Labels for the plot
          scale_y_datetime(
               date_labels = "%H:%M",
               date_breaks = "2 hours",
               sec.axis = dup_axis(name = "")
          ) +  # Format x-axis for time
          facet_grid(~ month_day, scales = "free") +
          ggplot_theming(legend.position = "right")  # Apply custom theme
     
     # Save the plot as a PNG file
     base_path <- "data/plots/"
     plot_path <- paste0(base_path, "ggVisibilityHeat.png")
     ggsave(plot_path, plot = rPlot, scale = 1.5)
     
     # Read the PNG file and display it
     img <- readPNG(plot_path)
     grid::grid.raster(img)
}

# Visibility Categorical Heat ----
plot_visibility_categorical_heat <- function(con) {
     # Query to fetch visibility data
     query <- "
    SELECT
      visibility,
      visibility_category,
      common_date,
      time_only,
      month_day
    FROM
      forecast_data
    WHERE
      latitude = 38.748;
  "
     
     data <- execute_query(con, query)  # Execute the query and get the data

          # Create a ggplot object for categorical visibility heatmap
     # Convert time_only to POSIXct for plotting
     data$time_only <- as.POSIXct(data$time_only, format = "%H:%M:%S")
     
     # Create a ggplot object for weather codes
     rPlot <- ggplot(data, aes(x = month_day, y = time_only, fill = visibility_category)) +
          geom_tile() +  # Tile plot for visibility categories
          scale_fill_manual(
               values = c(
                    "Clearest (>30 km)" = "green",
                    "Excellent (10-30 km)" = "darkgreen",
                    "Good (5-10 km)" = "yellow",
                    "Moderate (2-5 km)" = "orange",
                    "Low (1-2 km)" = "red",
                    "Fog/Haze (<1 km)" = "purple"
               )
          ) +  # Manual color scale for visibility categories
          labs(
               title = "Visibility Category Map",
               x = "Date",
               y = "Time of Day",
               fill = "Visibility Level"
          ) +  # Labels for the plot
          scale_y_datetime(
               date_labels = "%H:%M",
               date_breaks = "2 hours",
               sec.axis = dup_axis(name = "")
          ) +  # Format y-axis for time
          facet_grid(~ month_day, scales = "free") +
          ggplot_theming(legend.position = "right")  # Apply custom theme
     
     # Save the plot as a PNG file
     base_path <- "data/plots/"
     plot_path <- paste0(base_path, "ggVisibilityCat.png")
     ggsave(plot_path, plot = rPlot, scale = 1.5)
     
     # Read the PNG file and display it
     img <- readPNG(plot_path)
     grid::grid.raster(img)
}

# Weather Codes ----
plot_weather_codes <- function(con) {
     # Query to fetch weather codes and descriptions
     query <- "
    SELECT
      fd.weather_code,
      wc.Description AS description,
      fd.time_only,
      fd.month_day
    FROM
      forecast_data fd
    LEFT JOIN weather_codes wc ON wc.weather_code == fd.weather_code
    WHERE
      latitude = 38.748;
  "
     
     data <- execute_query(con, query)  # Execute the query and get the data
     
     # Convert time_only to POSIXct for plotting
     data$time_only <- as.POSIXct(data$time_only, format = "%H:%M:%S")
     
     # Create a ggplot object for weather codes
     rPlot <- ggplot(
          data, aes(x = month_day, y = time_only, fill = description)) +
          geom_tile(alpha = 0.5) +  # Tile plot for weather codes
          scale_fill_paletteer_d("khroma::land") +  # Color scale for weather codes
          scale_y_datetime(
               date_labels = "%H:%M",
               date_breaks = "2 hours",
               sec.axis = dup_axis(name = "")
          ) +  # Format y-axis for time
          labs(
               title = "Weather Code Map",
               x = "Day",
               y = "Time of Day",
               fill = "Weather Code"
          ) +  # Labels for the plot
          facet_grid(~ month_day, scales = "free") +
          ggplot_theming(legend.position = "right")  # Apply custom theme
     
     # Save the plot as a PNG file
     base_path <- "data/plots/"
     plot_path <- paste0(base_path, "ggWeatherCodes.png")
     ggsave(plot_path, plot = rPlot, scale = 1.5)
     
     # Read the PNG file and display it
     img <- readPNG(plot_path)
     grid::grid.raster(img)
}

display_a_plot <- function(plot_path) {
     # Read the PNG file and display it
     img <- readPNG(plot_path)
     grid::grid.raster(img)     
}

Data Ingestion Workflow

Generally, data moves from:

Python ingestion → R loading → SQL transformations → final table materialization

workflow

workflow

Python can be used interchangeably for much of the workflow, so this can be adapted to different preferences.

Import

Weather Data API

(“🌤️ Free Open-Source Weather API Open-Meteo.com” n.d.)

“🌤️ Free Open-Source Weather API Open-Meteo.com.” n.d. Accessed February 8, 2025. https://open-meteo.com/.

Forecast

Run the API script to import the dataset.
import pandas as pd  # For generating the date range
import requests_cache  # For caching API requests to reduce load and improve performance
from retry_requests import retry  # For retrying failed API requests
import openmeteo_requests  # For interacting with the Open-Meteo API
from datetime import datetime, timezone  # For handling date and time

def import_api_hourly(latitude: float, longitude: float) -> pd.DataFrame:
     """
     Fetches hourly weather data from the Open-Meteo API for the given latitude and longitude.
     
     Parameters:
        latitude (float): The latitude of the location for which weather data is requested.
        longitude (float): The longitude of the location for which weather data is requested.
     
     Returns:
        pd.DataFrame: A Pandas DataFrame containing hourly weather data for the specified location.
     """
     
     # Setup the Open-Meteo API client with cache and retry on error
     # Caching reduces the number of API calls by storing responses for 1 hour (3600 seconds)
     cache_session = requests_cache.CachedSession('.cache', expire_after = 3600)
     
     # Retry mechanism: retry up to 5 times with exponential backoff if the request fails
     retry_session = retry(cache_session, retries = 5, backoff_factor = 0.2)
     
     # Initialize the Open-Meteo API client with the cached and retry-enabled session
     openmeteo = openmeteo_requests.Client(session = retry_session)
     
     # Define the API endpoint and parameters for the weather data request
     url = "https://api.open-meteo.com/v1/forecast"
     params = {
        "latitude": latitude,  # Latitude of the location
        "longitude": longitude,  # Longitude of the location
        "hourly": [  # List of hourly weather variables to fetch
            "temperature_2m",  # Temperature at 2 meters above ground
            "precipitation_probability",  # Probability of precipitation
            "precipitation",  # Total precipitation
            "rain",  # Rain amount
            "showers",  # Showers amount
            "snowfall",  # Snowfall amount
            "snow_depth",  # Snow depth
            "weather_code",  # Weather condition code
            "visibility",  # Visibility
            "wind_speed_10m",  # Wind speed at 10 meters above ground
            "wind_direction_10m"  # Wind direction at 10 meters above ground
        ],
        "temperature_unit": "fahrenheit",  # Temperature unit (Fahrenheit)
        "wind_speed_unit": "mph",  # Wind speed unit (miles per hour)
        "precipitation_unit": "inch",  # Precipitation unit (inches)
        "timezone": "America/Chicago",  # Timezone for the data
        #"forecast_days": 1,  # Number of forecast days (1 day)
        "past_hours": 6,  # Include past 6 hours of data
        "forecast_hours": 24,  # Include next 24 hours of forecast
        "models": "best_match"  # Use the best matching weather model
     }
     
     # Make the API request to fetch weather data
     responses = openmeteo.weather_api(url, params = params)
     
     # Process the first location in the response (only one location is requested)
     response = responses[0]
     
     # Print location and timezone information for debugging
     print(f"Coordinates {response.Latitude()}°N {response.Longitude()}°E")
     print(f"Elevation {response.Elevation()} m asl")
     print(f"Timezone {response.Timezone()} {response.TimezoneAbbreviation()}")
     print(f"Timezone difference to GMT+0 {response.UtcOffsetSeconds()} s")
     
     # Process hourly data. The order of variables needs to be the same as requested.
     hourly = response.Hourly()
     hourly_temperature_2m = hourly.Variables(0).ValuesAsNumpy()
     hourly_precipitation_probability = hourly.Variables(1).ValuesAsNumpy()
     hourly_precipitation = hourly.Variables(2).ValuesAsNumpy()
     hourly_rain = hourly.Variables(3).ValuesAsNumpy()
     hourly_showers = hourly.Variables(4).ValuesAsNumpy()
     hourly_snowfall = hourly.Variables(5).ValuesAsNumpy()
     hourly_snow_depth = hourly.Variables(6).ValuesAsNumpy()
     hourly_weather_code = hourly.Variables(7).ValuesAsNumpy()
     hourly_visibility = hourly.Variables(8).ValuesAsNumpy()
     hourly_wind_speed_10m = hourly.Variables(9).ValuesAsNumpy()
     hourly_wind_direction_10m = hourly.Variables(10).ValuesAsNumpy()
     
     hourly_data = {"date": pd.date_range(
        start = pd.to_datetime(hourly.Time(), unit = "s", utc = True),
        end = pd.to_datetime(hourly.TimeEnd(), unit = "s", utc = True),
        freq = pd.Timedelta(seconds = hourly.Interval()),
        inclusive = "left"
     )}
     
     hourly_data["latitude"] = latitude
     hourly_data["longitude"] = longitude
     hourly_data["temperature_2m"] = hourly_temperature_2m
     hourly_data["precipitation_probability"] = hourly_precipitation_probability
     hourly_data["precipitation"] = hourly_precipitation
     hourly_data["rain"] = hourly_rain
     hourly_data["showers"] = hourly_showers
     hourly_data["snowfall"] = hourly_snowfall
     hourly_data["snow_depth"] = hourly_snow_depth
     hourly_data["weather_code"] = hourly_weather_code
     hourly_data["visibility"] = hourly_visibility
     hourly_data["wind_speed_10m"] = hourly_wind_speed_10m
     hourly_data["wind_direction_10m"] = hourly_wind_direction_10m
     
     #data = pd.DataFrame(data = hourly_data)
     
     return(pd.DataFrame(data = hourly_data))
Write hourly api results.
coordinates <- list(
     c(34.0522, -118.2437),
     c(33.9806, -117.3755),
     c(34.1495, -117.2345),
     c(33.6103, -114.5964),
     c(33.4484, -112.0740),
     c(35.1983, -111.6513),
     c(35.0844, -106.6504),
     c(34.9333, -104.6876),
     c(35.2210, -101.8313),
     c(35.2161, -100.2491),
     c(35.4676, -97.5164),
     c(36.7538, -95.2206),
     c(37.0842, -94.5133),
     c(38.7480, -90.4390),
     c(39.1200, -88.5435),
     c(39.7684, -86.1581),
     c(39.7589, -84.1916),
     c(40.4406, -79.9959),
     c(39.9995, -78.2341),
     c(40.7357, -74.1724)
)


lats <- purrr::map_dbl(coordinates, 1)
lons <- purrr::map_dbl(coordinates, 2)

purrr::walk2(lats, lons, \(lat, lon) {
  dbWriteTable(
    duckdb_con,
    "forecast_data",
    py$import_api_hourly(lat, lon),
    append = TRUE
  )
}, .progress = FALSE)

Historical

Run the API script to import the dataset.
import openmeteo_requests
import requests_cache
import pandas as pd
import polars as pl
from retry_requests import retry

def import_api_hourly_historical(
     latitude: float, longitude: float, 
     startDate: str, # e.g. "1974-01-01"
     endDate: str # e.g. "2024-12-31"
     ) -> pl.DataFrame:
     # Setup the Open-Meteo API client with cache and retry on error
     cache_session = requests_cache.CachedSession('.cache', expire_after = -1)
     retry_session = retry(cache_session, retries = 5, backoff_factor = 0.2)
     openmeteo = openmeteo_requests.Client(session = retry_session)
     
     # Make sure all required weather variables are listed here
     # The order of variables in hourly or daily is important to assign them correctly below
     url = "https://archive-api.open-meteo.com/v1/archive"
     params = {
        "latitude": latitude,
        "longitude": longitude,
        "start_date": startDate,
        "end_date": endDate,
        "hourly": [
             "temperature_2m", 
             "precipitation", 
             "rain", 
             "snowfall", 
             "snow_depth", 
             "visibility",
             "weather_code", 
             "wind_speed_10m", 
             "wind_direction_10m"],
        "temperature_unit": "fahrenheit",
        "wind_speed_unit": "mph",
        "precipitation_unit": "inch",
        "timezone": "America/Chicago",
        "models": "best_match"
     }
     
     responses = openmeteo.weather_api(url, params = params)
     
     # Process first location. Add a for-loop for multiple locations or weather models
     response = responses[0]
     print(f"Coordinates {response.Latitude()}°N {response.Longitude()}°E")
     print(f"Elevation {response.Elevation()} m asl")
     print(f"Timezone {response.Timezone()} {response.TimezoneAbbreviation()}")
     print(f"Timezone difference to GMT+0 {response.UtcOffsetSeconds()} s")
     
     # Process hourly data. The order of variables needs to be the same as requested.
     hourly = response.Hourly()
     hourly_temperature_2m = hourly.Variables(0).ValuesAsNumpy()
     hourly_precipitation = hourly.Variables(1).ValuesAsNumpy()
     hourly_rain = hourly.Variables(2).ValuesAsNumpy()
     hourly_snowfall = hourly.Variables(3).ValuesAsNumpy()
     hourly_snow_depth = hourly.Variables(4).ValuesAsNumpy()
     hourly_visibility = hourly.Variables(5).ValuesAsNumpy()
     hourly_weather_code = hourly.Variables(6).ValuesAsNumpy()
     hourly_wind_speed_10m = hourly.Variables(7).ValuesAsNumpy()
     hourly_wind_direction_10m = hourly.Variables(8).ValuesAsNumpy()

     hourly_data = {"date": pd.date_range(
        start = pd.to_datetime(hourly.Time(), unit = "s", utc = True),
        end = pd.to_datetime(hourly.TimeEnd(), unit = "s", utc = True),
        freq = pd.Timedelta(seconds = hourly.Interval()),
        inclusive = "left"
     )}
     
     hourly_data["latitude"] = latitude
     hourly_data["longitude"] = longitude
     hourly_data["temperature_2m"] = hourly_temperature_2m
     hourly_data["precipitation"] = hourly_precipitation
     hourly_data["rain"] = hourly_rain
     hourly_data["snowfall"] = hourly_snowfall
     hourly_data["snow_depth"] = hourly_snow_depth
     hourly_data["visibility"] = hourly_visibility
     hourly_data["weather_code"] = hourly_weather_code
     hourly_data["wind_speed_10m"] = hourly_wind_speed_10m
     hourly_data["wind_direction_10m"] = hourly_wind_direction_10m
     
     return(pd.DataFrame(data = hourly_data))
Write hourly api historical data.
save_to_partition <- function(df, lat, lon) {
  # Add partitioning columns to the data frame
  df <- df|>
    mutate(
      lat = lat,
      lon = lon,
      year = year(date),
      month = month(date)
    )
  
  # Write to Hive partitions (folders auto-created)
  arrow::write_dataset(
    df,
    path = "data/historical_weather/",
    format = "parquet",
    partitioning = c("lat", "lon", "year", "month"),
    existing_data_behavior = "overwrite"  # or "delete_matching"
  )
}

coordinates1 <- list(
     c(34.0522, -118.2437),   # Los Angeles, CA (Start)
     c(33.9806, -117.3755),   # Riverside, CA (I-215 logistics)
     c(34.1495, -117.2345),   # San Bernardino, CA (I-10/I-215 interchange)
     c(33.6103, -114.5964),   # Blythe, CA (I-10 desert truck stop)
     c(33.4484, -112.0740)   # Phoenix, AZ (I-10)
)

coordinates2 <- list(
     c(35.1983, -111.6513),   # Flagstaff, AZ (I-40 mountain gateway)
     c(35.0844, -106.6504),   # Albuquerque, NM (I-40)
     c(34.9333, -104.6876),   # Santa Rosa, NM (I-40 rest area)
     c(35.2210, -101.8313),   # Amarillo, TX (I-40, "Big Texan" truck stop)
     c(35.2161, -100.2491)   # Shamrock, TX (I-40, near OK border)
)

coordinates3 <- list(
     c(35.4676, -97.5164),    # Oklahoma City, OK (I-40/I-44 junction)
     c(36.7538, -95.2206),    # Miami, OK (I-44, near MO border)
     c(37.0842, -94.5133),    # Joplin, MO (I-44 truck hub)
     c(38.7480, -90.4390),    # St. Louis, MO (I-44/I-70 interchange)
     c(39.1200, -88.5435)    # Effingham, IL (I-70 logistics hub)
)

coordinates4 <- list(
     c(39.7684, -86.1581),    # Indianapolis, IN (I-70 "Crossroads of America")
     c(39.7589, -84.1916),    # Dayton, OH (I-70/I-75 junction)
     c(40.4406, -79.9959),    # Pittsburgh, PA (I-76)
     c(39.9995, -78.2341),    # Breezewood, PA (I-70/I-76 truck stop)
     c(40.7357, -74.1724)     # Newark, NJ (End, NYC metro)
)

lats <- purrr::map_dbl(coordinates4, 1)
lons <- purrr::map_dbl(coordinates4, 2)

purrr::walk2(lats, lons, \(lat, lon) {

     df <- py$import_api_hourly_historical(lat, lon, "1974-01-01", "2024-12-31")
     
     save_to_partition(df, lat, lon)

     # Delay to avoid API rate limits
     Sys.sleep(300)

}, .progress = FALSE)

storage://

Where the historical data is stored:

~/data/weather_data/lat= … /lon= … /year= … /month= … /part-0.parquet

Create a table from the hive partitioned dataset.
CREATE OR REPLACE TABLE historical_data AS 
SELECT * 
FROM read_parquet(
     'data/historical_weather/*/*/*/*/part-0.parquet', --lat/lon/year/month
     hive_partitioning = true);

About the Weather Data

The study, published in the Weather and Forecasting journal, focuses on evaluating and improving the accuracy of weather prediction models, particularly for severe weather events. It examines the performance of high-resolution numerical weather prediction (NWP) models in forecasting convective storms, which are critical for predicting severe weather such as thunderstorms, hail, and tornadoes. The research highlights advancements in model resolution, data assimilation techniques, and the integration of observational data to enhance forecast precision. The findings emphasize the importance of these improvements for short-term (nowcasting) and medium-range forecasts, particularly in regions prone to severe weather, like the central United States (including Missouri). Dowell et al. (2022)

Dowell, David C., Curtis R. Alexander, Eric P. James, Stephen S. Weygandt, Stanley G. Benjamin, Geoffrey S. Manikin, Benjamin T. Blake, et al. 2022. “The High-Resolution Rapid Refresh (HRRR): An Hourly Updating Convection-Allowing Forecast Model. Part I: Motivation and System Description.” Weather and Forecasting 37 (8): 1371–95. https://doi.org/10.1175/WAF-D-21-0151.1.
table setup
# Create the tibble
forecast_models <- tibble(
     Model = c("GFS", "HRRR"),
     Developed_By = c(
          "NOAA (National Oceanic and Atmospheric Administration)",
          "NOAA (specifically by the Earth System Research Laboratory)"
     ),
     Scope = c(
          "Global",
          "Regional (primarily focused on the contiguous United States)"
     ),
     Resolution = c(
          "Lower resolution compared to HRRR (approximately 13 km as of recent updates)",
          "High resolution (3 km)"
     ),
     Forecast_Range = c("Up to 16 days", "Up to 18 hours"),
     Updates = c("Runs four times a day (00Z, 06Z, 12Z, 18Z)", "Runs every hour"),
     Applications = c(
          "Used for long-term weather forecasting, climate modeling, and global weather patterns.",
          "Ideal for short-term, detailed weather forecasting, including severe weather events like thunderstorms, tornadoes, and localized precipitation."
     )
)

locations_list = colnames(forecast_models)

notes_list =  list(
     "",
  "Organization or entity responsible for developing the model.",
  "Geographical coverage of the model (e.g., global or regional).",
  "Spatial resolution of the model, indicating the level of detail in the forecasts.",
  "Time period for which the model provides forecasts.",
  "Frequency at which the model is updated with new data.",
  "Primary uses and strengths of the model in weather forecasting."
  )

footnotes_df <- tibble(
     notes = notes_list, 
     locations = locations_list
)

pal_df <- tibble(
     cols = locations_list
#  pals = list(eval_palette("viridis::viridis", 2, 'c', 1))
)

rTable <- r_table_theming(
     forecast_models,
     title = "Forecast Models: Attributes",
     subtitle = NULL,
     footnotes_df,
     source_note = md("**source**: "),
     pal_df,
     multiline_feet = TRUE,
     table_font_size = pct(85),
     target_everything = TRUE,
     row_name_col = "Model"
)
Table 1
Forecast Models: Attributes
Developed_By1 Scope2 Resolution3 Forecast_Range4 Updates5 Applications6
GFS NOAA (National Oceanic and Atmospheric Administration) Global Lower resolution compared to HRRR (approximately 13 km as of recent updates) Up to 16 days Runs four times a day (00Z, 06Z, 12Z, 18Z) Used for long-term weather forecasting, climate modeling, and global weather patterns.
HRRR NOAA (specifically by the Earth System Research Laboratory) Regional (primarily focused on the contiguous United States) High resolution (3 km) Up to 18 hours Runs every hour Ideal for short-term, detailed weather forecasting, including severe weather events like thunderstorms, tornadoes, and localized precipitation.
source:
1 Organization or entity responsible for developing the model.
2 Geographical coverage of the model (e.g., global or regional).
3 Spatial resolution of the model, indicating the level of detail in the forecasts.
4 Time period for which the model provides forecasts.
5 Frequency at which the model is updated with new data.
6 Primary uses and strengths of the model in weather forecasting.
table setup
forecast_model_differences <- tibble(
"Resolution" = c(
"HRRR has a much higher resolution than GFS, making it more accurate for short-term, localized forecasts."
),
"Forecast_Range" = c("GFS provides forecasts for a much longer period compared to HRRR."),
"Update_Frequency" =  c(
"HRRR updates more frequently, which is crucial for capturing rapidly changing weather conditions."
)
)

locations_list = colnames(forecast_model_differences)

notes_list =  list(
  "Spatial resolution of the model, indicating the level of detail in the forecasts.",
  "Time period for which the model provides forecasts.",
  "Frequency at which the model is updated with new data.")

footnotes_df <- tibble(
  notes = notes_list, 
  locations = locations_list)

pal_df <- tibble(
  cols = locations_list
#  pals = list(eval_palette("viridis::viridis", 2, 'c', 1))
)

rTable <- r_table_theming(
forecast_model_differences,
title = "Forecast Models: Differences",
subtitle = NULL,
footnotes_df,
source_note = md("**source**: "),
pal_df,
multiline_feet = TRUE,
table_font_size = pct(85),
target_everything = TRUE,
row_name_col = NULL
)
Table 2
Forecast Models: Differences
Resolution1 Forecast_Range2 Update_Frequency3
HRRR has a much higher resolution than GFS, making it more accurate for short-term, localized forecasts. GFS provides forecasts for a much longer period compared to HRRR. HRRR updates more frequently, which is crucial for capturing rapidly changing weather conditions.
source:
1 Spatial resolution of the model, indicating the level of detail in the forecasts.
2 Time period for which the model provides forecasts.
3 Frequency at which the model is updated with new data.

Database Setup

load enum file
#' Create ENUM Type and Associate Codes with Descriptions
#'
#' This function creates an ENUM type in DuckDB and associates codes with their descriptions.
#' It can be used to create other ENUM types and associations
#'
#' @param duckdb_conn A DuckDB connection object.
#' @param enum_name A string specifying the name of the ENUM type to be created.
#' @param table_name A string specifying the name of the ENUM dictionary table.
#' @param codes A character vector of codes to be included in the ENUM type.
#' @param descriptions A character vector of descriptions corresponding to the codes.
#' @example
#' \dontrun{
#' library(DBI)
#' 
#' codes <- c('0', '1', '2', '3', '45', '48', '51', '53', '55', '56', '57', 
#'            '61', '63', '65', '66', '67', '71', '73', '75', '77', '80', '81', 
#'            '82', '85', '86', '95', '96', '99')
#' descriptions <- c('Clear sky', 'Mainly clear', 'Partly cloudy', 'Overcast', 
#'                   'Fog', 'Depositing rime fog', 'Drizzle: Light', 'Drizzle: Moderate', 
#'                   'Drizzle: Dense', 'Freezing Drizzle: Light', 'Freezing Drizzle: Dense', 
#'                   'Rain: Slight', 'Rain: Moderate', 'Rain: Heavy', 'Freezing Rain: Light', 
#'                   'Freezing Rain: Heavy', 'Snow fall: Slight', 'Snow fall: Moderate', 
#'                   'Snow fall: Heavy', 'Snow grains', 'Rain showers: Slight', 
#'                   'Rain showers: Moderate', 'Rain showers: Violent', 'Snow showers: Slight', 
#'                   'Snow showers: Heavy', 'Thunderstorm: Slight or moderate', 
#'                   'Thunderstorm with slight hail', 'Thunderstorm with heavy hail')
#' 
#' result <- create_enum_and_associate(duckdb_con, "WeatherCode", codes, descriptions)
#' print(result)
#' }
#' @export
create_enum_and_associate <- function(duckdb_con, enum_name, table_name, code_frame) {
     
     # Attempt to drop the ENUM type if it exists
     drop_query <- paste0("DROP TYPE IF EXISTS ", enum_name, ";")
     
     tryCatch({
          dbExecute(duckdb_con, drop_query)
          message(paste("Dropped existing ENUM type:", enum_name))
     }, error = \(e) {
          message(paste0("No existing ENUM type to drop: ", enum_name))
     })
     
     # Create the ENUM type
     enum_query <- paste0(
          "CREATE TYPE ", enum_name, " AS ENUM (",
          paste0(
               "'", code_frame$weather_code, "'", collapse = ", "), ");"
          )
     
     dbExecute(duckdb_con, enum_query)
     message(paste0("Created ENUM type: ", enum_name))
     
     # Write an association table for reference
     dbWriteTable(
          duckdb_con,
          table_name,
          code_frame,
          overwrite = TRUE
     )
}
Sets the custom data types in the database.
code_frame <- tibble::tibble(
weather_code = c(
     '0',
     '1',
     '2',
     '3',
     '45',
     '48',
     '51',
     '53',
     '55',
     '56',
     '57',
     '61',
     '63',
     '65',
     '66',
     '67',
     '71',
     '73',
     '75',
     '77',
     '80',
     '81',
     '82',
     '85',
     '86',
     '95',
     '96',
     '99'
),

description = c(
     'Clear sky',
     'Mainly clear',
     'Partly cloudy',
     'Overcast',
     'Fog',
     'Depositing rime fog',
     'Drizzle: light',
     'Drizzle: moderate',
     'Drizzle: dense',
     'Freezing drizzle: light',
     'Freezing drizzle: dense',
     'Rain: slight',
     'Rain: moderate',
     'Rain: heavy',
     'Freezing rain: light',
     'Freezing rain: heavy',
     'Snow fall: slight',
     'Snow fall: moderate',
     'Snow fall: heavy',
     'Snow grains',
     'Rain showers: slight',
     'Rain showers: moderate',
     'Rain showers: violent',
     'Snow showers: slight',
     'Snow showers: heavy',
     'Thunderstorm: slight or moderate',
     'Thunderstorm with slight hail',
     'Thunderstorm with heavy hail'
),

implication = c(
     "Normal operations - No restrictions",              # Clear sky
     "Normal operations - Increased vigilance",          # Mainly clear
     "Normal operations - Monitor weather updates",      # Partly cloudy
     "Reduced visibility - Maintain safe following distance", # Overcast
     "Speed reduction required - Fog lights mandatory",  # Fog
     "Speed reduction required - Extreme caution",        # Depositing rime fog
     "Potential minor delays - Road surface slickness",   # Drizzle: light
     "Speed restrictions - 15% reduction recommended",    # Drizzle: moderate
     "Mandatory speed reduction - 25%+",                 # Drizzle: dense
     "Chain requirement - Level 1 traction advisory",     # Freezing drizzle: light
     "Road closure likely - Avoid non-essential travel",  # Freezing drizzle: dense
     "Increased stopping distance - 10% speed reduction", # Rain: slight
     "15-20% speed reduction - Check tire tread",         # Rain: moderate
     "25%+ speed reduction - Possible detour routing",    # Rain: heavy
     "Mandatory chains - Temperature monitoring",         # Freezing rain: light
     "Road closure imminent - Immediate stop advised",    # Freezing rain: heavy
     "15% speed reduction - Traction control engaged",    # Snow fall: slight
     "25% speed reduction - Chain requirement possible",  # Snow fall: moderate
     "Road closure likely - Abandon shipment staging",    # Snow fall: heavy
     "Speed restriction - Watch for black ice",           # Snow grains
     "Increased following distance - 4-second rule",      # Rain showers: slight
     "20% speed reduction - Avoid lane changes",          # Rain showers: moderate
     "Immediate parking advised - Flash flood risk",      # Rain showers: violent
     "Chain requirement - Trailer brake check",           # Snow showers: slight
     "Road closure protocol activated",                   # Snow showers: heavy
     "Delay shipments - No open-top trailers",            # Thunderstorm: slight/mod
     "Immediate stop - Seek shelter",                     # Thunderstorm w/ slight hail
     "Catastrophic risk - Emergency protocols"            # Thunderstorm w/ heavy hail
),

risk_score = c(
     0.1,  # Clear sky
     0.15, # Mainly clear
     0.2,  # Partly cloudy
     0.25, # Overcast
     0.4,  # Fog
     0.5,  # Depositing rime fog
     0.3,  # Drizzle: light
     0.35, # Drizzle: moderate
     0.45, # Drizzle: dense
     0.55, # Freezing drizzle: light
     0.8,  # Freezing drizzle: dense
     0.3,  # Rain: slight
     0.4,  # Rain: moderate
     0.6,  # Rain: heavy
     0.65, # Freezing rain: light
     0.85, # Freezing rain: heavy
     0.4,  # Snow fall: slight
     0.6,  # Snow fall: moderate
     0.75, # Snow fall: heavy
     0.5,  # Snow grains
     0.35, # Rain showers: slight
     0.5,  # Rain showers: moderate
     0.7,  # Rain showers: violent
     0.6,  # Snow showers: slight
     0.8,  # Snow showers: heavy
     0.65, # Thunderstorm: slight/mod
     0.85, # Thunderstorm w/ slight hail
     0.95  # Thunderstorm w/ heavy hail
  ),

dot_compliance = c(
     "§392.14(a)",              # Clear sky
     "§392.14(a)",              # Mainly clear
     "§392.14(a)",              # Partly cloudy
     "§392.14(b)",              # Overcast
     "§392.14(b)+§393.75(c)",   # Fog
     "§392.14(c)",              # Depositing rime fog
     "§392.71(a)",              # Drizzle: light
     "§392.71(b)",              # Drizzle: moderate
     "§392.71(c)",              # Drizzle: dense
     "§392.16(a)",              # Freezing drizzle: light
     "§392.16(c)",              # Freezing drizzle: dense
     "§392.71(a)",              # Rain: slight
     "§392.71(b)",              # Rain: moderate
     "§392.71(c)",              # Rain: heavy
     "§392.16(b)+§393.95(d)",   # Freezing rain: light
     "§392.16(c)",              # Freezing rain: heavy
     "§392.14(b)+§393.95(a)",   # Snow fall: slight
     "§392.14(c)+§393.95(b)",   # Snow fall: moderate
     "§392.16(c)",              # Snow fall: heavy
     "§392.14(c)",              # Snow grains
     "§392.14(b)",              # Rain showers: slight
     "§392.14(c)",              # Rain showers: moderate
     "§392.16(c)",              # Rain showers: violent
     "§393.95(c)",              # Snow showers: slight
     "§392.16(c)",              # Snow showers: heavy
     "§392.14(d)+§393.75(e)",   # Thunderstorm: slight/mod
     "§392.16(c)",              # Thunderstorm w/ slight hail
     "§392.16(e)"               # Thunderstorm w/ heavy hail
),

severity = cut(
risk_score,
breaks = c(0, 0.3, 0.5, 0.7, 1),
labels = c("Low", "Moderate", "High", "Critical")
),

insurance_surcharge = c(
     0,    # Clear sky
     0,    # Mainly clear
     0.05, # Partly cloudy (5%)
     0.07, # Overcast (7%)
     0.1,  # Fog (10%)
     0.15, # Rime fog (15%)
     0.08, # Light drizzle (8%)
     0.12, # Moderate drizzle (12%)
     0.18, # Dense drizzle (18%)
     0.25, # Freezing drizzle light (25%)
     0.4,  # Freezing drizzle dense (40%)
     0.1,  # Rain slight (10%)
     0.15, # Rain moderate (15%)
     0.25, # Rain heavy (25%)
     0.35, # Freezing rain light (35%)
     0.5,  # Freezing rain heavy (50%)
     0.2,  # Snow slight (20%)
     0.3,  # Snow moderate (30%)
     0.45, # Snow heavy (45%)
     0.25, # Snow grains (25%)
     0.12, # Rain showers slight (12%)
     0.2,  # Rain showers moderate (20%)
     0.35, # Rain showers violent (35%)
     0.3,  # Snow showers slight (30%)
     0.5,  # Snow showers heavy (50%)
     0.4,  # Thunderstorm (40%)
     0.6,  # Thunderstorm w/ slight hail (60%)
     0.8   # Thunderstorm w/ heavy hail (80%)
),

fuel_multiplier = c(
     1.0,  # Clear sky
     1.0,  # Mainly clear
     1.03, # Partly cloudy (3%)
     1.05, # Overcast (5%)
     1.12, # Fog (12%)
     1.15, # Rime fog (15%)
     1.07, # Light drizzle (7%)
     1.1,  # Moderate drizzle (10%)
     1.15, # Dense drizzle (15%)
     1.25, # Freezing drizzle light (25%)
     1.4,  # Freezing drizzle dense (40%)
     1.08, # Rain slight (8%)
     1.12, # Rain moderate (12%)
     1.2,  # Rain heavy (20%)
     1.3,  # Freezing rain light (30%)
     1.5,  # Freezing rain heavy (50%)
     1.15, # Snow slight (15%)
     1.25, # Snow moderate (25%)
     1.4,  # Snow heavy (40%)
     1.2,  # Snow grains (20%)
     1.1,  # Rain showers slight (10%)
     1.15, # Rain showers moderate (15%)
     1.3,  # Rain showers violent (30%)
     1.25, # Snow showers slight (25%)
     1.45, # Snow showers heavy (45%)
     1.35, # Thunderstorm (35%)
     1.6,  # Thunderstorm w/ slight hail (60%)
     2.0   # Thunderstorm w/ heavy hail (100%)
  ),

route_delay_factor = c(
     1.0,  # Clear sky
     1.0,  # Mainly clear
     1.00,  # Partly cloudy
     1.01,  # Overcast
     1.05,  # Fog
     1.08,  # Rime fog
     1.03,  # Light drizzle
     1.06,  # Moderate drizzle
     1.2,  # Dense drizzle
     1.25,  # Freezing drizzle light
     1.4,  # Freezing drizzle dense
     1.04,  # Rain slight
     1.08,  # Rain moderate
     1.25,  # Rain heavy
     1.3,  # Freezing rain light
     1.5,  # Freezing rain heavy
     1.2,  # Snow slight
     1.3,  # Snow moderate
     1.45,  # Snow heavy
     1.25,  # Snow grains
     1.05,  # Rain showers slight
     1.2,  # Rain showers moderate
     1.35,  # Rain showers violent
     1.3,  # Snow showers slight
     1.5,  # Snow showers heavy
     1.3,  # Thunderstorm
     1.6,  # Thunderstorm w/ slight hail
     2.0  # Thunderstorm w/ heavy hail
),

# New Labor & Equipment Columns
safety_inspections = c(
     "Pre-trip only",                    # Clear sky
     "Pre-trip + mid-trip visual",       # Mainly clear
     "Pre-trip + brake check",           # Partly cloudy
     "Pre-trip + hourly tire checks",    # Overcast
     "Pre-trip + fog light checks",      # Fog
     "Pre-trip + 30-min interval checks",# Rime fog
     "Pre-trip + 2hr brake tests",       # Drizzle: light
     "Pre-trip + 1hr brake tests",       # Drizzle: moderate
     "Pre-trip + 30min brake tests",     # Drizzle: dense
     "Pre-trip + axle temp monitoring",  # Freezing drizzle: light
     "Continuous monitoring required",   # Freezing drizzle: dense
     "Pre-trip + wiper checks",          # Rain: slight
     "Pre-trip + 2hr wiper checks",      # Rain: moderate
     "Pre-trip + 30min wiper checks",    # Rain: heavy
     "Pre-trip + chain integrity checks",# Freezing rain: light
     "Roadside inspections mandatory",   # Freezing rain: heavy
     "Pre-trip + tire chain prep",       # Snow fall: slight
     "Pre-trip + hourly chain checks",   # Snow fall: moderate
     "Continuous chain monitoring",      # Snow fall: heavy
     "Pre-trip + sanding required",      # Snow grains
     "Pre-trip + drainage checks",       # Rain showers: slight
     "Pre-trip + undercarriage checks",  # Rain showers: moderate
     "Abort trip + full inspection",     # Rain showers: violent
     "Pre-trip + plow attachment",       # Snow showers: slight
     "Roadside de-icing required",       # Snow showers: heavy
     "Pre-trip + lightning protocol",    # Thunderstorm: slight/mod
     "Immediate shelter + inspection",   # Thunderstorm w/ slight hail
     "Post-storm forensic inspection"    # Thunderstorm w/ heavy hail
),

driver_wage_premium = c(
     0.00,  # Clear sky
     0.00,   # Mainly clear
     0.05,   # Partly cloudy (+5%)
     0.07,   # Overcast (+7%)
     0.15,   # Fog (+15%)
     0.20,   # Rime fog (+20%)
     0.10,   # Drizzle: light (+10%)
     0.12,   # Drizzle: moderate (+12%)
     0.18,   # Drizzle: dense (+18%)
     0.25,   # Freezing drizzle: light (+25%)
     0.40,   # Freezing drizzle: dense (+40%)
     0.10,   # Rain: slight (+10%)
     0.15,   # Rain: moderate (+15%)
     0.25,   # Rain: heavy (+25%)
     0.35,   # Freezing rain: light (+35%)
     0.50,   # Freezing rain: heavy (+50%)
     0.20,   # Snow fall: slight (+20%)
     0.30,   # Snow fall: moderate (+30%)
     0.45,   # Snow fall: heavy (+45%)
     0.25,   # Snow grains (+25%)
     0.12,   # Rain showers: slight (+12%)
     0.20,   # Rain showers: moderate (+20%)
     0.35,   # Rain showers: violent (+35%)
     0.30,   # Snow showers: slight (+30%)
     0.50,   # Snow showers: heavy (+50%)
     0.40,   # Thunderstorm (+40%)
     0.60,   # Thunderstorm w/ slight hail (+60%)
     0.80    # Thunderstorm w/ heavy hail (+80%)
),
  
equipment_wear_factor = c(
     1.0,   # Clear sky
     1.02,  # Mainly clear (+2%)
     1.05,  # Partly cloudy (+5%)
     1.07,  # Overcast (+7%)
     1.15,  # Fog (+15%)
     1.20,  # Rime fog (+20%)
     1.10,  # Drizzle: light (+10%)
     1.12,  # Drizzle: moderate (+12%)
     1.18,  # Drizzle: dense (+18%)
     1.25,  # Freezing drizzle: light (+25%)
     1.40,  # Freezing drizzle: dense (+40%)
     1.12,  # Rain: slight (+12%)
     1.15,  # Rain: moderate (+15%)
     1.25,  # Rain: heavy (+25%)
     1.35,  # Freezing rain: light (+35%)
     1.50,  # Freezing rain: heavy (+50%)
     1.20,  # Snow fall: slight (+20%)
     1.30,  # Snow fall: moderate (+30%)
     1.45,  # Snow fall: heavy (+45%)
     1.25,  # Snow grains (+25%)
     1.10,  # Rain showers: slight (+10%)
     1.15,  # Rain showers: moderate (+15%)
     1.30,  # Rain showers: violent (+30%)
     1.25,  # Snow showers: slight (+25%)
     1.45,  # Snow showers: heavy (+45%)
     1.35,  # Thunderstorm (+35%)
     1.60,  # Thunderstorm w/ slight hail (+60%)
     2.0    # Thunderstorm w/ heavy hail (+100%)
),
  
carbon_multiplier = c(
     1.00,  # Clear sky
     1.01,  # Mainly clear (+1%)
     1.03,  # Partly cloudy (+3%)
     1.05,  # Overcast (+5%)
     1.12,  # Fog (+12%)
     1.15,  # Rime fog (+15%)
     1.07,  # Drizzle: light (+7%)
     1.10,  # Drizzle: moderate (+10%)
     1.15,  # Drizzle: dense (+15%)
     1.22,  # Freezing drizzle: light (+22%)
     1.35,  # Freezing drizzle: dense (+35%)
     1.08,  # Rain: slight (+8%)
     1.12,  # Rain: moderate (+12%)
     1.20,  # Rain: heavy (+20%)
     1.28,  # Freezing rain: light (+28%)
     1.45,  # Freezing rain: heavy (+45%)
     1.15,  # Snow fall: slight (+15%)
     1.25,  # Snow fall: moderate (+25%)
     1.40,  # Snow fall: heavy (+40%)
     1.20,  # Snow grains (+20%)
     1.10,  # Rain showers: slight (+10%)
     1.15,  # Rain showers: moderate (+15%)
     1.30,  # Rain showers: violent (+30%)
     1.25,  # Snow showers: slight (+25%)
     1.40,  # Snow showers: heavy (+40%)
     1.35,  # Thunderstorm (+35%)
     1.55,  # Thunderstorm w/ slight hail (+55%)
     1.80   # Thunderstorm w/ heavy hail (+80%)
),

# Bridge Weight Restrictions (FHWA Load Rating Manual)
bridge_weight_limit = c(
1.00, 1.00, 0.98, 0.95, 0.90, 0.85, 0.92, 0.88, 0.82, 0.75, 0.60,
0.93, 0.87, 0.78, 0.65, 0.50, 0.85, 0.72, 0.55, 0.80, 0.91, 0.86,
0.60, 0.70, 0.45, 0.68, 0.40, 0.30
),
  
# Toll Multipliers (IBTTA 2023 Storm Surcharge Index)
toll_multiplier = c(
1.00, 1.00, 1.05, 1.07, 1.15, 1.25, 1.10, 1.15, 1.22, 1.35, 2.00,
1.12, 1.18, 1.30, 1.45, 1.80, 1.20, 1.35, 1.60, 1.25, 1.13, 1.20,
1.70, 1.40, 2.10, 1.55, 2.30, 3.00
),
  
# Border Crossing Delays (CBP TRIP Data)
border_delay_hours = c(
0.0, 0.0, 0.5, 0.7, 1.2, 2.0, 0.8, 1.1, 1.8, 2.5, 6.0,
0.9, 1.3, 2.2, 3.5, 8.0, 1.5, 2.8, 5.0, 1.7, 1.0, 1.5,
4.0, 2.5, 7.0, 3.0, 9.0, 12.0
),
  
# API Endpoints
reroute_api = c(
     NA_character_,  # Clear sky
     NA_character_,  # Mainly clear
     "HERE Weather API v3",  # Partly cloudy
     "HERE Weather API v3",  # Overcast
     "FHWA ARCHIS Live",  # Fog
     "FHWA ARCHIS Live",  # Rime fog
     "Google Maps Directions",  # Drizzle
     "Google Maps Directions",  # Drizzle
     "Google Maps Directions",  # Drizzle
     "FMCSA SMS API",  # Freezing drizzle
     "FMCSA SMS API",  # Freezing drizzle
     "USDOT NTAD",  # Rain
     "USDOT NTAD",  # Rain
     "USDOT NTAD",  # Rain
     "FMCSA SMS API",  # Freezing rain
     "FMCSA SMS API",  # Freezing rain
     "FHWA RWIS",  # Snow
     "FHWA RWIS",  # Snow
     "FHWA RWIS",  # Snow
     "USGS Streamflow",  # Snow grains
     "NOAA NOWData",  # Rain showers
     "NOAA NOWData",  # Rain showers
     "USGS Flood Events",  # Rain showers violent
     "FHWA CCAP",  # Snow showers
     "FHWA CCAP",  # Snow showers
     "NWS CAP Alerts",  # Thunderstorm
     "NWS CAP Alerts",  # Thunderstorm hail
     "DHS HSIN"  # Severe hail
)

)

create_enum_and_associate(
duckdb_con, 
"weather_code_enum", 
"weather_codes",
code_frame
)
Dropped existing ENUM type: weather_code_enum
Created ENUM type: weather_code_enum
table setup
rTable <- tbl(duckdb_con, "weather_codes") |> collect()

locations_list = colnames(rTable)

notes_list <- list(
"WMO weather code (1-99). See WMO Publication No. 306 for official code definitions.",
"Plain-language weather condition description based on WMO standards.",
"Recommended trucking operational response per FMCSA §392.14 and industry best practices.",
"Numeric risk assessment (0-1 scale) where 0.7+ triggers DOT emergency protocols (§392.16).",
"Key FMCSA regulation sections requiring compliance during these conditions.",
"Categorical risk level: Low (<0.3), Moderate (0.3-0.5), High (0.5-0.7), Critical (0.7+).",
"Percentage increase to cargo insurance premiums during these conditions. Based on TTClub 2023 claims data.",
"Fuel consumption multiplier (1.0 = baseline). Accounts for reduced MPG in adverse conditions (EPA SmartWay data).",
"Expected delay multiplier for route planning (1.0 = no delay). Derived from FHWA Highway Performance Monitoring System.",
"FMCSA §396.11-13 mandated inspection protocols. 'Continuous monitoring' requires ELD-integrated systems.",
"Teamsters National Master Freight Agreement Article 38 hazard pay provisions. Percentages added to base pay.",
"ATA Technology & Maintenance Council wear indices. 1.0 = baseline maintenance costs.",
"EPA SmartWay GHG emission factors. Includes idling, rerouting, and traction energy impacts.",
"FHWA LRFR bridge capacity multiplier (1.0 = 80k lbs standard). Based on NBI Condition Reports.",
"IBTTA inclement weather surcharge schedule. Applies to E-ZPass/Presto toll systems.",
"CBP Trade Relief Interface Program data: Average commercial lane delays at POE.",
"Official API endpoints for real-time routing. Requires agency credentials."
)

footnotes_df <- tibble(
  notes = notes_list, 
  locations = locations_list)

calc_distinct_obs <- code_frame |>
group_by(risk_score) |>
distinct() |>
length()

pal_df <- tibble(
  cols = locations_list,
  pals = list(eval_palette("grDevices::RdYlGn", calc_distinct_obs, 'c', -1))
  #pals = list(eval_palette("basetheme::brutal", 7, 'd', 1))
)

rTable <- r_table_theming(
rTable,
title = "Weather Code: As Data Type",
subtitle = NULL,
footnotes_df,
source_note = md("**source**: World Meteorlogical Organization"),
pal_df,
multiline_feet = TRUE,
table_font_size = pct(80),
target_everything = TRUE,
color_by_columns = "risk_score",
#row_name_col = "Model"
)

WMO CODE TABLE 4677” (2025)

Table 3: How the WMO codes are associated to weather events.
Weather Code: As Data Type
weather_code1 description2 implication3 risk_score4 dot_compliance5 severity6 insurance_surcharge7 fuel_multiplier8 route_delay_factor9 safety_inspections10 driver_wage_premium11 equipment_wear_factor12 carbon_multiplier13 bridge_weight_limit14 toll_multiplier15 border_delay_hours16 reroute_api17
0 Clear sky Normal operations - No restrictions 0.10 §392.14(a) Low 0.00 1.00 1.00 Pre-trip only 0.00 1.00 1.00 1.00 1.00 0.0 NA
1 Mainly clear Normal operations - Increased vigilance 0.15 §392.14(a) Low 0.00 1.00 1.00 Pre-trip + mid-trip visual 0.00 1.02 1.01 1.00 1.00 0.0 NA
2 Partly cloudy Normal operations - Monitor weather updates 0.20 §392.14(a) Low 0.05 1.03 1.00 Pre-trip + brake check 0.05 1.05 1.03 0.98 1.05 0.5 HERE Weather API v3
3 Overcast Reduced visibility - Maintain safe following distance 0.25 §392.14(b) Low 0.07 1.05 1.01 Pre-trip + hourly tire checks 0.07 1.07 1.05 0.95 1.07 0.7 HERE Weather API v3
45 Fog Speed reduction required - Fog lights mandatory 0.40 §392.14(b)+§393.75(c) Moderate 0.10 1.12 1.05 Pre-trip + fog light checks 0.15 1.15 1.12 0.90 1.15 1.2 FHWA ARCHIS Live
48 Depositing rime fog Speed reduction required - Extreme caution 0.50 §392.14(c) Moderate 0.15 1.15 1.08 Pre-trip + 30-min interval checks 0.20 1.20 1.15 0.85 1.25 2.0 FHWA ARCHIS Live
51 Drizzle: light Potential minor delays - Road surface slickness 0.30 §392.71(a) Low 0.08 1.07 1.03 Pre-trip + 2hr brake tests 0.10 1.10 1.07 0.92 1.10 0.8 Google Maps Directions
53 Drizzle: moderate Speed restrictions - 15% reduction recommended 0.35 §392.71(b) Moderate 0.12 1.10 1.06 Pre-trip + 1hr brake tests 0.12 1.12 1.10 0.88 1.15 1.1 Google Maps Directions
55 Drizzle: dense Mandatory speed reduction - 25%+ 0.45 §392.71(c) Moderate 0.18 1.15 1.20 Pre-trip + 30min brake tests 0.18 1.18 1.15 0.82 1.22 1.8 Google Maps Directions
56 Freezing drizzle: light Chain requirement - Level 1 traction advisory 0.55 §392.16(a) High 0.25 1.25 1.25 Pre-trip + axle temp monitoring 0.25 1.25 1.22 0.75 1.35 2.5 FMCSA SMS API
57 Freezing drizzle: dense Road closure likely - Avoid non-essential travel 0.80 §392.16(c) Critical 0.40 1.40 1.40 Continuous monitoring required 0.40 1.40 1.35 0.60 2.00 6.0 FMCSA SMS API
61 Rain: slight Increased stopping distance - 10% speed reduction 0.30 §392.71(a) Low 0.10 1.08 1.04 Pre-trip + wiper checks 0.10 1.12 1.08 0.93 1.12 0.9 USDOT NTAD
63 Rain: moderate 15-20% speed reduction - Check tire tread 0.40 §392.71(b) Moderate 0.15 1.12 1.08 Pre-trip + 2hr wiper checks 0.15 1.15 1.12 0.87 1.18 1.3 USDOT NTAD
65 Rain: heavy 25%+ speed reduction - Possible detour routing 0.60 §392.71(c) High 0.25 1.20 1.25 Pre-trip + 30min wiper checks 0.25 1.25 1.20 0.78 1.30 2.2 USDOT NTAD
66 Freezing rain: light Mandatory chains - Temperature monitoring 0.65 §392.16(b)+§393.95(d) High 0.35 1.30 1.30 Pre-trip + chain integrity checks 0.35 1.35 1.28 0.65 1.45 3.5 FMCSA SMS API
67 Freezing rain: heavy Road closure imminent - Immediate stop advised 0.85 §392.16(c) Critical 0.50 1.50 1.50 Roadside inspections mandatory 0.50 1.50 1.45 0.50 1.80 8.0 FMCSA SMS API
71 Snow fall: slight 15% speed reduction - Traction control engaged 0.40 §392.14(b)+§393.95(a) Moderate 0.20 1.15 1.20 Pre-trip + tire chain prep 0.20 1.20 1.15 0.85 1.20 1.5 FHWA RWIS
73 Snow fall: moderate 25% speed reduction - Chain requirement possible 0.60 §392.14(c)+§393.95(b) High 0.30 1.25 1.30 Pre-trip + hourly chain checks 0.30 1.30 1.25 0.72 1.35 2.8 FHWA RWIS
75 Snow fall: heavy Road closure likely - Abandon shipment staging 0.75 §392.16(c) Critical 0.45 1.40 1.45 Continuous chain monitoring 0.45 1.45 1.40 0.55 1.60 5.0 FHWA RWIS
77 Snow grains Speed restriction - Watch for black ice 0.50 §392.14(c) Moderate 0.25 1.20 1.25 Pre-trip + sanding required 0.25 1.25 1.20 0.80 1.25 1.7 USGS Streamflow
80 Rain showers: slight Increased following distance - 4-second rule 0.35 §392.14(b) Moderate 0.12 1.10 1.05 Pre-trip + drainage checks 0.12 1.10 1.10 0.91 1.13 1.0 NOAA NOWData
81 Rain showers: moderate 20% speed reduction - Avoid lane changes 0.50 §392.14(c) Moderate 0.20 1.15 1.20 Pre-trip + undercarriage checks 0.20 1.15 1.15 0.86 1.20 1.5 NOAA NOWData
82 Rain showers: violent Immediate parking advised - Flash flood risk 0.70 §392.16(c) High 0.35 1.30 1.35 Abort trip + full inspection 0.35 1.30 1.30 0.60 1.70 4.0 USGS Flood Events
85 Snow showers: slight Chain requirement - Trailer brake check 0.60 §393.95(c) High 0.30 1.25 1.30 Pre-trip + plow attachment 0.30 1.25 1.25 0.70 1.40 2.5 FHWA CCAP
86 Snow showers: heavy Road closure protocol activated 0.80 §392.16(c) Critical 0.50 1.45 1.50 Roadside de-icing required 0.50 1.45 1.40 0.45 2.10 7.0 FHWA CCAP
95 Thunderstorm: slight or moderate Delay shipments - No open-top trailers 0.65 §392.14(d)+§393.75(e) High 0.40 1.35 1.30 Pre-trip + lightning protocol 0.40 1.35 1.35 0.68 1.55 3.0 NWS CAP Alerts
96 Thunderstorm with slight hail Immediate stop - Seek shelter 0.85 §392.16(c) Critical 0.60 1.60 1.60 Immediate shelter + inspection 0.60 1.60 1.55 0.40 2.30 9.0 NWS CAP Alerts
99 Thunderstorm with heavy hail Catastrophic risk - Emergency protocols 0.95 §392.16(e) Critical 0.80 2.00 2.00 Post-storm forensic inspection 0.80 2.00 1.80 0.30 3.00 12.0 DHS HSIN
source: World Meteorlogical Organization
1 WMO weather code (1-99). See WMO Publication No. 306 for official code definitions.
2 Plain-language weather condition description based on WMO standards.
3 Recommended trucking operational response per FMCSA §392.14 and industry best practices.
4 Numeric risk assessment (0-1 scale) where 0.7+ triggers DOT emergency protocols (§392.16).
5 Key FMCSA regulation sections requiring compliance during these conditions.
6 Categorical risk level: Low (<0.3), Moderate (0.3-0.5), High (0.5-0.7), Critical (0.7+).
7 Percentage increase to cargo insurance premiums during these conditions. Based on TTClub 2023 claims data.
8 Fuel consumption multiplier (1.0 = baseline). Accounts for reduced MPG in adverse conditions (EPA SmartWay data).
9 Expected delay multiplier for route planning (1.0 = no delay). Derived from FHWA Highway Performance Monitoring System.
10 FMCSA §396.11-13 mandated inspection protocols. 'Continuous monitoring' requires ELD-integrated systems.
11 Teamsters National Master Freight Agreement Article 38 hazard pay provisions. Percentages added to base pay.
12 ATA Technology & Maintenance Council wear indices. 1.0 = baseline maintenance costs.
13 EPA SmartWay GHG emission factors. Includes idling, rerouting, and traction energy impacts.
14 FHWA LRFR bridge capacity multiplier (1.0 = 80k lbs standard). Based on NBI Condition Reports.
15 IBTTA inclement weather surcharge schedule. Applies to E-ZPass/Presto toll systems.
16 CBP Trade Relief Interface Program data: Average commercial lane delays at POE.
17 Official API endpoints for real-time routing. Requires agency credentials.
Code
-- Create ENUM for wind direction
CREATE TYPE cardinal_direction_enum AS ENUM (
     'N', 
     'NE', 
     'E', 
     'SE', 
     'S', 
     'SW', 
     'W', 
     'NW'
);

CREATE TYPE month_name_enum AS ENUM (
     'January', 
     'February', 
     'March', 
     'April', 
     'May',
     'June', 
     'July', 
     'August', 
     'September', 
     'October', 
     'November', 
     'December'
);

CREATE TYPE month_abb_enum AS ENUM (
     'Jan', 
     'Feb', 
     'Mar', 
     'Apr', 
     'May',
     'Jun', 
     'Jul', 
     'Aug', 
     'Sep', 
     'Oct', 
     'Nov', 
     'Dec'
);

CREATE TYPE weekday_name_enum AS ENUM (
     'Sunday', 
     'Monday', 
     'Tuesday', 
     'Wednesday', 
     'Thursday', 
     'Friday', 
     'Saturday'
);

CREATE TYPE weekday_abb_enum AS ENUM (
     'Sun', 
     'Mon', 
     'Tue', 
     'Wed', 
     'Thu', 
     'Fri', 
     'Sat'
);

CREATE TYPE visibility_cat_enum AS ENUM (
     'Clearest (>30 km)', 
     'Excellent (10-30 km)', 
     'Good (5-10 km)', 
     'Moderate (2-5 km)', 
     'Low (1-2 km)', 
     'Fog/Haze (<1 km)'
  );
  
CREATE TYPE speed_bin_enum AS ENUM (
     '0-2', 
     '2-4', 
     '4-6', 
     '6-8', 
     '8-10', 
     '10+'
     );

Transformation

Stages:

  • Cleaning (numeric formatting, type casting)

  • Feature engineering (wind bins, direction calculations)

  • Temporal decomposition (date/time elements extraction)

  • Categorical labeling (visibility categories, enum mapping)

Transformation

Transformation

Dataset: Forecast, Next Day

Views enhance transformation safety by acting as virtual tables, processing data dynamically without storing intermediates or risking source corruption. They enable iterative logic refinement, avoiding table rewrites. DuckDB optimizes view queries through computation pushdown, boosting efficiency. Self-documenting views clarify transformation logic, fostering collaboration and maintenance

Modular SQL, in-database transformation
-- Create or replace the view with modular CTE's and explicit column lists
CREATE OR REPLACE VIEW transformed_forecast AS
WITH cleaned_data AS (
  SELECT
    date,
    ROUND(temperature_2m::FLOAT, 1) AS temperature_2m,
    precipitation_probability,
    ROUND(precipitation::FLOAT, 3) AS precipitation,
    ROUND(rain::FLOAT, 3) AS rain,
    ROUND(showers::FLOAT, 3) AS showers,
    ROUND(snowfall::FLOAT, 3) AS snowfall,
    ROUND(snow_depth::FLOAT, 3) AS snow_depth,
    weather_code,
    ROUND(visibility::FLOAT, 1) AS visibility,
    ROUND(wind_speed_10m::FLOAT, 2) AS wind_speed_10m,
    wind_direction_10m,
    latitude,
    longitude
  FROM forecast_data
),

transformed_data AS (
  SELECT
    *,
    -- Speed bin
    CASE 
      WHEN wind_speed_10m <= 2 THEN CAST('0-2' AS speed_bin_enum)
      WHEN wind_speed_10m <= 4 THEN CAST('2-4' AS speed_bin_enum)
      WHEN wind_speed_10m <= 6 THEN CAST('4-6' AS speed_bin_enum)
      WHEN wind_speed_10m <= 8 THEN CAST('6-8' AS speed_bin_enum)
      WHEN wind_speed_10m <= 10 THEN CAST('8-10' AS speed_bin_enum)
      ELSE CAST('10+' AS speed_bin_enum)
    END AS speed_bin,
    -- Cardinal direction
    CASE 
      WHEN wind_direction_10m BETWEEN 0 AND 22.5 THEN CAST('N' AS cardinal_direction_enum)
      WHEN wind_direction_10m BETWEEN 22.5 AND 67.5 THEN CAST('NE' AS cardinal_direction_enum)
      WHEN wind_direction_10m BETWEEN 67.5 AND 112.5 THEN CAST('E' AS cardinal_direction_enum)
      WHEN wind_direction_10m BETWEEN 112.5 AND 157.5 THEN CAST('SE' AS cardinal_direction_enum)
      WHEN wind_direction_10m BETWEEN 157.5 AND 202.5 THEN CAST('S' AS cardinal_direction_enum)
      WHEN wind_direction_10m BETWEEN 202.5 AND 247.5 THEN CAST('SW' AS cardinal_direction_enum)
      WHEN wind_direction_10m BETWEEN 247.5 AND 292.5 THEN CAST('W' AS cardinal_direction_enum)
      WHEN wind_direction_10m BETWEEN 292.5 AND 337.5 THEN CAST('NW' AS cardinal_direction_enum)
      WHEN wind_direction_10m BETWEEN 337.5 AND 360 THEN CAST('N' AS cardinal_direction_enum)
      ELSE NULL
    END AS wind_direction_cardinal,
    -- 15-degree direction bin (numeric)
    FLOOR((wind_direction_10m - 1e-9) / 15) * 15 AS direction_bin
  FROM cleaned_data
),

final_data AS (
  SELECT
    *,
    -- Direction angle
    CASE
      WHEN wind_direction_cardinal = 'N' THEN 0
      WHEN wind_direction_cardinal = 'NE' THEN 45
      WHEN wind_direction_cardinal = 'E' THEN 90
      WHEN wind_direction_cardinal = 'SE' THEN 135
      WHEN wind_direction_cardinal = 'S' THEN 180
      WHEN wind_direction_cardinal = 'SW' THEN 225
      WHEN wind_direction_cardinal = 'W' THEN 270
      WHEN wind_direction_cardinal = 'NW' THEN 315
      ELSE NULL
    END AS direction_angle,
    -- Visibility category
    CASE
      WHEN visibility > 30000 THEN CAST('Clearest (>30 km)' AS visibility_cat_enum)
      WHEN visibility > 10000 THEN CAST('Excellent (10-30 km)' AS visibility_cat_enum)
      WHEN visibility > 5000 THEN CAST('Good (5-10 km)' AS visibility_cat_enum)
      WHEN visibility > 2000 THEN CAST('Moderate (2-5 km)' AS visibility_cat_enum)
      WHEN visibility > 1000 THEN CAST('Low (1-2 km)' AS visibility_cat_enum)
      WHEN visibility <= 1000 THEN CAST('Fog/Haze (<1 km)' AS visibility_cat_enum)
      ELSE NULL
    END AS visibility_category,
    -- Date parts
    strftime(date, '%Y-%m-%d') AS date_only,
    EXTRACT(YEAR FROM date) AS year,
    EXTRACT(MONTH FROM date) AS month,
    EXTRACT(hour FROM date) AS hour,
    monthname(date)::month_name_enum AS month_name,
    strftime(date, '%b')::month_abb_enum AS month_abb,
    EXTRACT(DAY FROM date) AS day,
    dayname(date)::weekday_name_enum AS weekday_name,
    strftime(date, '%a')::weekday_abb_enum AS weekday_abb,
    strftime(date, '%b %d') AS month_day,
    strftime(date, '%H:%M:%S') AS time_only,
    strptime('1970-01-01 ' || strftime(date, '%H:%M:%S'), '%Y-%m-%d %H:%M:%S') AS common_date
  FROM transformed_data
)

-- Final output
SELECT * FROM final_data;
Code
SELECT * FROM transformed_forecast;
table setup
r_df <- viewOfForecast |>
dplyr::mutate(
     date = as.character(date),
     common_date = as.character(common_date)
)

locations_list = colnames(r_df)

notes_list <-c(
  "Date of the recorded data.",
  "Temperature at 2 meters above ground.",
  "Probability of precipitation.",
  "Amount of precipitation.",
  "Amount of rain.",
  "Amount of showers.",
  "Amount of snowfall.",
  "Depth of snow.",
  "Code representing the weather condition.",
  "Visibility distance.",
  "Wind speed at 10 meters above ground.",
  "Wind direction at 10 meters above ground.",
  "Vertical location coordinate.", 
  "Horizontal location coordinate.",
  "Binned categories for wind speed.",
  "Cardinal direction of the wind.",
  "Binned categories for wind direction.",
  "Numeric angle representing wind direction.",
  "Categorized visibility levels.",
  "Date without time",
  "Year extracted from the date.",
  "Month extracted from the date.",
  "Hour extracted from the date.",
  "Name of the month.",
  "Abbreviated name of the month.",
  "Day extracted from the date.",
  "Name of the weekday.",
  "Abbreviated name of the weekday.",
  "Combined month and day.",
  "Time extracted from the date.",
  "Common date format for time-based analysis."
)

footnotes_df <- tibble(
  notes = notes_list, 
  locations = locations_list
)

pal_df <- tibble(
  cols = locations_list,
  pals = list(eval_palette("grDevices::Rocket", 10 , 'c', 1))
)

rTable <- r_table_theming(
r_df,
title = "Forecast Data Preview",
subtitle = NULL,
footnotes_df,
source_note = md("**source**: "),
pal_df,
footnotes_multiline = FALSE,
table_font_size = pct(70),
#do_col_labels = TRUE,
)
Table 4
Forecast Data Preview
date1 temperature_2m2 precipitation_probability3 precipitation4 rain5 showers6 snowfall7 snow_depth8 weather_code9 visibility10 wind_speed_10m11 wind_direction_10m12 latitude13 longitude14 speed_bin15 wind_direction_cardinal16 direction_bin17 direction_angle18 visibility_category19 date_only20 year21 month22 hour23 month_name24 month_abb25 day26 weekday_name27 weekday_abb28 month_day29 time_only30 common_date31
2025-04-18 14:00:00 56.2 0 0.000 0.000 0 0.000 0.000 3 67913.4 4.22 302.005341 34.0522 -118.2437 4-6 NW 300 315 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 57.0 0 0.000 0.000 0 0.000 0.000 3 66273.0 3.39 277.594543 34.0522 -118.2437 2-4 W 270 270 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 56.1 0 0.000 0.000 0 0.000 0.000 3 62007.9 3.12 248.962418 34.0522 -118.2437 2-4 W 240 270 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 57.5 0 0.000 0.000 0 0.000 0.000 3 69881.9 2.85 224.999893 34.0522 -118.2437 2-4 SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 59.6 0 0.000 0.000 0 0.000 0.000 3 83333.3 4.30 242.102829 34.0522 -118.2437 4-6 SW 240 225 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 61.4 0 0.000 0.000 0 0.000 0.000 3 86942.3 4.80 207.758453 34.0522 -118.2437 4-6 SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 63.5 0 0.000 0.000 0 0.000 0.000 3 102690.3 5.46 214.992096 34.0522 -118.2437 4-6 SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 63.6 0 0.000 0.000 0 0.000 0.000 3 102034.1 7.26 236.309906 34.0522 -118.2437 6-8 SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 63.1 0 0.000 0.000 0 0.000 0.000 3 95144.4 9.48 250.709854 34.0522 -118.2437 8-10 W 240 270 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 62.7 0 0.000 0.000 0 0.000 0.000 3 92847.8 9.02 246.614761 34.0522 -118.2437 8-10 SW 240 225 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 62.0 0 0.000 0.000 0 0.000 0.000 2 87270.3 8.61 242.102829 34.0522 -118.2437 8-10 SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 60.1 0 0.000 0.000 0 0.000 0.000 1 82677.2 8.31 246.194046 34.0522 -118.2437 8-10 SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 57.8 0 0.000 0.000 0 0.000 0.000 1 72506.6 6.44 249.676773 34.0522 -118.2437 6-8 W 240 270 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 56.0 0 0.000 0.000 0 0.000 0.000 1 62007.9 4.74 250.709854 34.0522 -118.2437 4-6 W 240 270 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 54.3 0 0.000 0.000 0 0.000 0.000 0 54461.9 2.83 251.564957 34.0522 -118.2437 2-4 W 240 270 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 53.4 0 0.000 0.000 0 0.000 0.000 2 51837.3 1.14 281.309906 34.0522 -118.2437 0-2 W 270 270 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 54.0 0 0.000 0.000 0 0.000 0.000 3 50524.9 1.00 333.435028 34.0522 -118.2437 0-2 NW 330 315 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 52.8 0 0.000 0.000 0 0.000 0.000 2 48884.5 2.06 347.471191 34.0522 -118.2437 2-4 N 345 0 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 50.8 0 0.000 0.000 0 0.000 0.000 0 45931.8 1.80 7.124930 34.0522 -118.2437 0-2 N 0 0 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 49.7 0 0.000 0.000 0 0.000 0.000 0 43963.3 2.42 33.690102 34.0522 -118.2437 2-4 NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 48.5 0 0.000 0.000 0 0.000 0.000 0 43635.2 2.53 44.999897 34.0522 -118.2437 2-4 NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 47.8 0 0.000 0.000 0 0.000 0.000 0 44619.4 4.16 36.253937 34.0522 -118.2437 4-6 NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 47.0 0 0.000 0.000 0 0.000 0.000 0 45603.7 4.72 31.429514 34.0522 -118.2437 4-6 NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 47.1 0 0.000 0.000 0 0.000 0.000 0 45275.6 2.94 8.746089 34.0522 -118.2437 2-4 N 0 0 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 47.9 0 0.000 0.000 0 0.000 0.000 0 43963.3 4.52 8.530692 34.0522 -118.2437 4-6 N 0 0 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 54.0 0 0.000 0.000 0 0.000 0.000 1 50196.9 2.00 333.435028 34.0522 -118.2437 0-2 NW 330 315 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 58.3 0 0.000 0.000 0 0.000 0.000 1 66601.0 2.68 270.000000 34.0522 -118.2437 2-4 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 63.2 0 0.000 0.000 0 0.000 0.000 0 89566.9 3.23 236.309906 34.0522 -118.2437 2-4 SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 68.6 0 0.000 0.000 0 0.000 0.000 0 133858.3 4.53 237.094757 34.0522 -118.2437 4-6 SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 70.8 0 0.000 0.000 0 0.000 0.000 0 144685.0 8.64 259.562561 34.0522 -118.2437 8-10 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 54.9 3 0.000 0.000 0 0.000 0.000 3 64632.5 1.43 218.659836 33.9806 -117.3755 0-2 SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 55.7 3 0.000 0.000 0 0.000 0.000 3 58070.9 1.00 296.564972 33.9806 -117.3755 0-2 NW 285 315 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 55.9 2 0.000 0.000 0 0.000 0.000 3 64304.5 2.01 270.000000 33.9806 -117.3755 2-4 W 255 270 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 57.7 1 0.000 0.000 0 0.000 0.000 3 67257.2 2.12 288.435028 33.9806 -117.3755 2-4 W 285 270 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 56.0 1 0.000 0.000 0 0.000 0.000 3 62992.1 4.59 313.025085 33.9806 -117.3755 4-6 NW 300 315 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 58.8 1 0.000 0.000 0 0.000 0.000 3 85301.8 3.61 291.801483 33.9806 -117.3755 2-4 W 285 270 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 61.5 1 0.000 0.000 0 0.000 0.000 3 99409.5 4.94 275.194336 33.9806 -117.3755 4-6 W 270 270 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 63.8 1 0.000 0.000 0 0.000 0.000 3 124015.8 4.61 284.036255 33.9806 -117.3755 4-6 W 270 270 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 65.8 1 0.000 0.000 0 0.000 0.000 3 135498.7 8.64 280.437408 33.9806 -117.3755 8-10 W 270 270 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 63.9 1 0.000 0.000 0 0.000 0.000 3 125984.3 10.19 278.841736 33.9806 -117.3755 10+ W 270 270 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 63.1 1 0.000 0.000 0 0.000 0.000 3 121063.0 11.11 279.272522 33.9806 -117.3755 10+ W 270 270 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 61.3 1 0.000 0.000 0 0.000 0.000 3 108267.7 10.19 278.841736 33.9806 -117.3755 10+ W 270 270 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 59.0 0 0.000 0.000 0 0.000 0.000 3 96784.8 8.91 281.592133 33.9806 -117.3755 8-10 W 270 270 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 56.1 1 0.000 0.000 0 0.000 0.000 3 84317.6 6.41 282.094727 33.9806 -117.3755 6-8 W 270 270 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 55.0 1 0.000 0.000 0 0.000 0.000 3 75459.3 6.00 296.564972 33.9806 -117.3755 4-6 NW 285 315 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 53.5 1 0.000 0.000 0 0.000 0.000 1 68897.6 4.30 297.897186 33.9806 -117.3755 4-6 NW 285 315 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 51.4 0 0.000 0.000 0 0.000 0.000 0 65288.7 1.63 195.945465 33.9806 -117.3755 0-2 S 195 180 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 50.0 0 0.000 0.000 0 0.000 0.000 0 63648.3 1.57 180.000000 33.9806 -117.3755 0-2 S 165 180 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 48.6 0 0.000 0.000 0 0.000 0.000 0 58398.9 3.47 194.931473 33.9806 -117.3755 2-4 S 180 180 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 47.4 0 0.000 0.000 0 0.000 0.000 1 52821.5 3.75 162.645889 33.9806 -117.3755 2-4 S 150 180 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 46.7 0 0.000 0.000 0 0.000 0.000 3 49212.6 3.80 135.000107 33.9806 -117.3755 2-4 SE 135 135 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 45.7 0 0.000 0.000 0 0.000 0.000 1 45275.6 3.64 79.380394 33.9806 -117.3755 2-4 E 75 90 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 44.7 0 0.000 0.000 0 0.000 0.000 2 41010.5 4.00 63.435013 33.9806 -117.3755 2-4 NE 60 45 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 49.8 0 0.000 0.000 0 0.000 0.000 3 43635.2 1.70 156.801376 33.9806 -117.3755 0-2 SE 150 135 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 49.5 0 0.000 0.000 0 0.000 0.000 1 44947.5 1.61 146.309906 33.9806 -117.3755 0-2 SE 135 135 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 54.3 0 0.000 0.000 0 0.000 0.000 0 73818.9 0.00 270.000000 33.9806 -117.3755 0-2 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 65.4 0 0.000 0.000 0 0.000 0.000 0 259514.4 8.06 1.591111 33.9806 -117.3755 8-10 N 0 0 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 69.8 0 0.000 0.000 0 0.000 0.000 0 292979.0 8.30 4.635381 33.9806 -117.3755 8-10 N 0 0 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 73.0 0 0.000 0.000 0 0.000 0.000 0 295275.6 15.46 14.237315 33.9806 -117.3755 10+ N 0 0 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 75.5 0 0.000 0.000 0 0.000 0.000 0 295275.6 15.41 9.188767 33.9806 -117.3755 10+ N 0 0 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 51.7 8 0.000 0.000 0 0.000 0.000 3 68241.5 8.11 27.979382 34.1495 -117.2345 8-10 NE 15 45 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 50.8 7 0.000 0.000 0 0.000 0.000 3 54461.9 3.01 41.987129 34.1495 -117.2345 2-4 NE 30 45 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 51.7 6 0.000 0.000 0 0.000 0.000 3 53477.7 1.41 71.564964 34.1495 -117.2345 0-2 E 60 90 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 53.6 3 0.000 0.000 0 0.000 0.000 3 60367.5 2.20 203.962494 34.1495 -117.2345 2-4 SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 52.4 3 0.000 0.000 0 0.000 0.000 3 54461.9 4.80 297.758423 34.1495 -117.2345 4-6 NW 285 315 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 54.7 2 0.000 0.000 0 0.000 0.000 3 67257.2 4.22 302.005341 34.1495 -117.2345 4-6 NW 300 315 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 57.3 2 0.000 0.000 0 0.000 0.000 3 78412.1 2.06 257.471191 34.1495 -117.2345 2-4 W 255 270 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 59.6 2 0.000 0.000 0 0.000 0.000 3 99081.4 3.96 253.610382 34.1495 -117.2345 2-4 W 240 270 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 60.7 3 0.000 0.000 0 0.000 0.000 3 104986.9 3.36 273.813995 34.1495 -117.2345 2-4 W 270 270 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 62.0 2 0.000 0.000 0 0.000 0.000 3 119094.5 4.52 261.469330 34.1495 -117.2345 4-6 W 255 270 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 61.2 5 0.000 0.000 0 0.000 0.000 3 114501.3 8.39 260.789032 34.1495 -117.2345 8-10 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 59.1 8 0.000 0.000 0 0.000 0.000 3 104002.6 8.35 262.304047 34.1495 -117.2345 8-10 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 57.7 9 0.000 0.000 0 0.000 0.000 3 97112.9 6.94 268.152435 34.1495 -117.2345 6-8 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 56.3 6 0.000 0.000 0 0.000 0.000 3 86286.1 5.66 279.090179 34.1495 -117.2345 4-6 W 270 270 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 55.1 1 0.000 0.000 0 0.000 0.000 3 77099.7 4.70 295.346130 34.1495 -117.2345 4-6 NW 285 315 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 53.6 1 0.000 0.000 0 0.000 0.000 3 69881.9 4.41 293.962494 34.1495 -117.2345 4-6 NW 285 315 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 51.2 0 0.000 0.000 0 0.000 0.000 1 64304.5 2.92 274.398621 34.1495 -117.2345 2-4 W 270 270 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 48.7 0 0.000 0.000 0 0.000 0.000 0 56758.5 1.80 277.124908 34.1495 -117.2345 0-2 W 270 270 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 47.2 0 0.000 0.000 0 0.000 0.000 0 52493.4 4.11 119.357666 34.1495 -117.2345 4-6 SE 105 135 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 46.5 0 0.000 0.000 0 0.000 0.000 1 44619.4 5.30 117.645889 34.1495 -117.2345 4-6 SE 105 135 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 46.0 0 0.000 0.000 0 0.000 0.000 1 40026.2 4.70 115.346138 34.1495 -117.2345 4-6 SE 105 135 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 45.5 0 0.000 0.000 0 0.000 0.000 0 40026.2 3.91 113.629387 34.1495 -117.2345 2-4 SE 105 135 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 44.1 0 0.000 0.000 0 0.000 0.000 3 40026.2 2.30 119.054512 34.1495 -117.2345 2-4 SE 105 135 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 47.3 0 0.000 0.000 0 0.000 0.000 1 114173.2 4.22 327.994659 34.1495 -117.2345 4-6 NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 50.8 0 0.000 0.000 0 0.000 0.000 0 222112.9 8.77 19.359097 34.1495 -117.2345 8-10 N 15 0 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 57.1 0 0.000 0.000 0 0.000 0.000 0 171587.9 1.14 191.309891 34.1495 -117.2345 0-2 S 180 180 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 65.0 0 0.000 0.000 0 0.000 0.000 0 295275.6 10.28 44.118694 34.1495 -117.2345 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 67.5 0 0.000 0.000 0 0.000 0.000 0 295275.6 12.22 34.562592 34.1495 -117.2345 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 70.0 0 0.000 0.000 0 0.000 0.000 0 295275.6 14.29 39.920341 34.1495 -117.2345 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 72.4 0 0.000 0.000 0 0.000 0.000 0 295275.6 15.35 36.702953 34.1495 -117.2345 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 56.2 0 0.000 0.000 0 0.000 0.000 0 94816.3 1.12 180.000000 33.6103 -114.5964 0-2 S 165 180 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 61.1 0 0.000 0.000 0 0.000 0.000 0 104658.8 4.72 211.429520 33.6103 -114.5964 4-6 SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 66.0 0 0.000 0.000 0 0.000 0.000 0 132217.8 4.61 219.093842 33.6103 -114.5964 4-6 SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 71.3 0 0.000 0.000 0 0.000 0.000 0 166338.6 4.61 219.093842 33.6103 -114.5964 4-6 SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 74.3 0 0.000 0.000 0 0.000 0.000 0 186023.6 6.33 237.994659 33.6103 -114.5964 6-8 SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 77.4 0 0.000 0.000 0 0.000 0.000 1 193897.6 8.57 229.236481 33.6103 -114.5964 8-10 SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 78.0 1 0.000 0.000 0 0.000 0.000 3 200459.3 11.04 252.299484 33.6103 -114.5964 10+ W 240 270 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 79.6 1 0.000 0.000 0 0.000 0.000 3 222112.9 8.97 265.710938 33.6103 -114.5964 8-10 W 255 270 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 78.2 2 0.000 0.000 0 0.000 0.000 3 229002.6 7.44 263.088867 33.6103 -114.5964 6-8 W 255 270 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 78.7 2 0.000 0.000 0 0.000 0.000 3 220800.5 12.10 236.309906 33.6103 -114.5964 10+ SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 77.9 2 0.000 0.000 0 0.000 0.000 3 241141.7 10.82 251.939438 33.6103 -114.5964 10+ W 240 270 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 76.6 2 0.000 0.000 0 0.000 0.000 3 232283.5 9.11 245.323151 33.6103 -114.5964 8-10 SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 74.3 2 0.000 0.000 0 0.000 0.000 3 218175.9 9.91 241.699341 33.6103 -114.5964 8-10 SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 72.3 2 0.000 0.000 0 0.000 0.000 1 196194.2 8.69 235.491409 33.6103 -114.5964 8-10 SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 70.0 2 0.000 0.000 0 0.000 0.000 3 174868.8 1.30 239.036301 33.6103 -114.5964 0-2 SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 67.3 0 0.000 0.000 0 0.000 0.000 2 212926.5 4.41 59.534538 33.6103 -114.5964 4-6 NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 63.7 0 0.000 0.000 0 0.000 0.000 0 279855.7 2.41 68.198532 33.6103 -114.5964 2-4 E 60 90 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 62.2 0 0.000 0.000 0 0.000 0.000 0 291338.6 3.18 320.710602 33.6103 -114.5964 2-4 NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 59.5 0 0.000 0.000 0 0.000 0.000 0 295275.6 6.24 255.465500 33.6103 -114.5964 6-8 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 55.7 0 0.000 0.000 0 0.000 0.000 0 288713.9 7.02 322.765076 33.6103 -114.5964 6-8 NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 56.5 0 0.000 0.000 0 0.000 0.000 0 274606.3 8.61 332.102814 33.6103 -114.5964 8-10 NW 330 315 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 53.9 0 0.000 0.000 0 0.000 0.000 0 259842.5 5.32 337.750916 33.6103 -114.5964 4-6 N 330 0 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 51.8 0 0.000 0.000 0 0.000 0.000 0 252952.8 2.53 44.999897 33.6103 -114.5964 2-4 NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 51.5 0 0.000 0.000 0 0.000 0.000 0 256233.6 6.83 328.392548 33.6103 -114.5964 6-8 NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 53.0 0 0.000 0.000 0 0.000 0.000 0 247047.3 1.57 270.000000 33.6103 -114.5964 0-2 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 64.3 0 0.000 0.000 0 0.000 0.000 0 273950.1 10.07 360.000000 33.6103 -114.5964 10+ N 345 0 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 67.7 0 0.000 0.000 0 0.000 0.000 0 285761.2 14.85 6.054107 33.6103 -114.5964 10+ N 0 0 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 71.0 0 0.000 0.000 0 0.000 0.000 0 295275.6 14.90 7.765082 33.6103 -114.5964 10+ N 0 0 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 74.0 0 0.000 0.000 0 0.000 0.000 0 295275.6 13.51 353.345673 33.6103 -114.5964 10+ N 345 0 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 76.4 0 0.000 0.000 0 0.000 0.000 0 295275.6 10.38 7.431319 33.6103 -114.5964 10+ N 0 0 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 62.3 1 0.000 0.000 0 0.000 0.000 3 167322.8 3.20 257.905243 33.4484 -112.0740 2-4 W 255 270 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 64.0 0 0.000 0.000 0 0.000 0.000 1 164698.2 2.55 105.255173 33.4484 -112.0740 2-4 E 105 90 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 67.3 0 0.000 0.000 0 0.000 0.000 0 167979.0 5.28 143.615555 33.4484 -112.0740 4-6 SE 135 135 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 69.2 0 0.000 0.000 0 0.000 0.000 1 168963.3 8.14 200.924576 33.4484 -112.0740 8-10 S 195 180 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 71.3 0 0.000 0.000 0 0.000 0.000 0 185367.5 7.20 233.841721 33.4484 -112.0740 6-8 SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 72.0 0 0.000 0.000 0 0.000 0.000 0 217847.8 8.30 242.744751 33.4484 -112.0740 8-10 SW 240 225 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 73.6 1 0.000 0.000 0 0.000 0.000 0 216535.4 9.62 252.407486 33.4484 -112.0740 8-10 W 240 270 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 74.7 1 0.000 0.000 0 0.000 0.000 0 225065.6 10.63 261.528931 33.4484 -112.0740 10+ W 255 270 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 75.6 1 0.000 0.000 0 0.000 0.000 1 228674.5 11.29 256.239197 33.4484 -112.0740 10+ W 255 270 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 75.7 2 0.000 0.000 0 0.000 0.000 1 235564.3 12.82 240.751266 33.4484 -112.0740 10+ SW 240 225 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 75.2 3 0.000 0.000 0 0.000 0.000 0 233595.8 13.41 244.290100 33.4484 -112.0740 10+ SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 73.9 9 0.000 0.000 0 0.000 0.000 0 232939.6 12.63 247.067871 33.4484 -112.0740 10+ SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 67.0 14 0.000 0.000 0 0.000 0.000 3 134842.5 15.71 324.272522 33.4484 -112.0740 10+ NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 62.3 17 0.020 0.020 0 0.000 0.000 53 22965.9 13.74 343.926361 33.4484 -112.0740 10+ N 330 0 Excellent (10-30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 62.6 22 0.000 0.000 0 0.000 0.000 3 99409.5 4.50 243.435013 33.4484 -112.0740 4-6 SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 62.8 17 0.000 0.000 0 0.000 0.000 3 139435.7 4.75 135.000107 33.4484 -112.0740 4-6 SE 135 135 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 61.3 20 0.000 0.000 0 0.000 0.000 3 101378.0 3.67 37.568665 33.4484 -112.0740 2-4 NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 60.9 14 0.000 0.000 0 0.000 0.000 3 93503.9 2.72 170.537750 33.4484 -112.0740 2-4 S 165 180 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 60.5 9 0.000 0.000 0 0.000 0.000 3 97112.9 5.30 117.645889 33.4484 -112.0740 4-6 SE 105 135 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 60.3 5 0.000 0.000 0 0.000 0.000 2 95472.4 6.34 132.137527 33.4484 -112.0740 6-8 SE 120 135 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 58.5 4 0.000 0.000 0 0.000 0.000 0 85958.0 1.61 146.309906 33.4484 -112.0740 0-2 SE 135 135 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 56.2 3 0.000 0.000 0 0.000 0.000 1 63976.4 5.83 265.601379 33.4484 -112.0740 4-6 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 54.6 1 0.000 0.000 0 0.000 0.000 0 65616.8 6.51 285.945465 33.4484 -112.0740 6-8 W 285 270 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 52.5 1 0.000 0.000 0 0.000 0.000 0 85301.8 5.10 285.255157 33.4484 -112.0740 4-6 W 285 270 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 55.4 1 0.000 0.000 0 0.000 0.000 0 127624.7 6.22 307.694305 33.4484 -112.0740 6-8 NW 300 315 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 59.6 1 0.000 0.000 0 0.000 0.000 0 173556.4 9.32 329.743652 33.4484 -112.0740 8-10 NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 63.4 0 0.000 0.000 0 0.000 0.000 0 195866.1 10.82 330.255219 33.4484 -112.0740 10+ NW 330 315 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 66.9 0 0.000 0.000 0 0.000 0.000 0 219488.2 7.60 317.385956 33.4484 -112.0740 6-8 NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 70.2 0 0.000 0.000 0 0.000 0.000 0 262467.2 6.22 300.256348 33.4484 -112.0740 6-8 NW 300 315 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 73.1 0 0.000 0.000 0 0.000 0.000 0 295275.6 6.64 315.000092 33.4484 -112.0740 6-8 NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 34.5 23 0.008 0.000 0 0.055 0.000 71 45275.6 12.75 285.255157 35.1983 -111.6513 10+ W 285 270 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 37.0 25 0.031 0.016 0 0.110 0.000 73 54133.9 13.51 257.574066 35.1983 -111.6513 10+ W 255 270 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 38.9 14 0.000 0.000 0 0.000 0.000 3 63320.2 13.61 242.592499 35.1983 -111.6513 10+ SW 240 225 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 38.4 16 0.004 0.004 0 0.000 0.000 51 58070.9 13.16 234.688705 35.1983 -111.6513 10+ SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 33.0 55 0.114 0.055 0 0.413 0.033 75 2624.7 10.52 293.838745 35.1983 -111.6513 10+ NW 285 315 Moderate (2-5 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 35.5 70 0.138 0.047 0 0.634 0.131 75 40354.3 17.49 290.984955 35.1983 -111.6513 10+ W 285 270 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 39.6 52 0.000 0.000 0 0.000 0.066 3 65616.8 16.41 264.522705 35.1983 -111.6513 10+ W 255 270 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 36.5 54 0.051 0.028 0 0.165 0.066 73 3937.0 13.21 268.058563 35.1983 -111.6513 10+ W 255 270 Moderate (2-5 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 36.9 73 0.028 0.016 0 0.083 0.033 73 6561.7 17.76 264.217682 35.1983 -111.6513 10+ W 255 270 Good (5-10 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 34.1 64 0.114 0.035 0 0.551 0.066 75 10826.8 13.52 286.336121 35.1983 -111.6513 10+ W 285 270 Excellent (10-30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 33.5 55 0.091 0.024 0 0.469 0.098 75 4921.3 10.69 285.780823 35.1983 -111.6513 10+ W 285 270 Moderate (2-5 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 33.0 40 0.024 0.008 0 0.110 0.098 73 18044.6 7.41 275.194336 35.1983 -111.6513 6-8 W 270 270 Excellent (10-30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 30.9 32 0.004 0.000 0 0.028 0.131 71 62992.1 9.52 299.577728 35.1983 -111.6513 8-10 NW 285 315 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 32.6 31 0.000 0.000 0 0.000 0.131 3 62336.0 0.45 360.000000 35.1983 -111.6513 0-2 N 345 0 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 29.4 11 0.000 0.000 0 0.000 0.131 3 40026.2 3.41 156.801376 35.1983 -111.6513 2-4 SE 150 135 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 29.0 6 0.000 0.000 0 0.000 0.131 45 328.1 2.91 112.619911 35.1983 -111.6513 2-4 SE 105 135 Fog/Haze (<1 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 29.2 4 0.000 0.000 0 0.000 0.131 45 656.2 6.64 122.619232 35.1983 -111.6513 6-8 SE 120 135 Fog/Haze (<1 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 29.3 2 0.000 0.000 0 0.000 0.131 3 7217.8 3.47 104.931473 35.1983 -111.6513 2-4 E 90 90 Good (5-10 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 28.6 2 0.000 0.000 0 0.000 0.131 2 41338.6 2.24 90.000000 35.1983 -111.6513 2-4 E 75 90 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 28.4 2 0.000 0.000 0 0.000 0.131 0 43635.2 2.03 353.659912 35.1983 -111.6513 2-4 N 345 0 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 28.6 4 0.000 0.000 0 0.000 0.131 0 47244.1 2.03 96.340096 35.1983 -111.6513 2-4 E 90 90 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 27.1 5 0.000 0.000 0 0.000 0.131 3 40682.4 3.50 206.564987 35.1983 -111.6513 2-4 SW 195 225 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 22.4 8 0.000 0.000 0 0.000 0.000 0 41994.8 0.92 165.963730 35.1983 -111.6513 0-2 S 165 180 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 30.0 6 0.000 0.000 0 0.000 0.000 0 79724.4 3.80 28.072395 35.1983 -111.6513 2-4 NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 30.9 5 0.000 0.000 0 0.000 0.000 3 51181.1 6.99 50.194473 35.1983 -111.6513 6-8 NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 33.2 7 0.000 0.000 0 0.000 0.000 1 73490.8 16.51 28.300659 35.1983 -111.6513 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 35.2 5 0.000 0.000 0 0.000 0.000 0 99081.4 19.39 39.382397 35.1983 -111.6513 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 38.4 5 0.000 0.000 0 0.000 0.000 0 127296.6 19.06 35.928600 35.1983 -111.6513 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 41.4 3 0.000 0.000 0 0.000 0.000 0 153543.3 15.90 39.289394 35.1983 -111.6513 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 43.6 2 0.000 0.000 0 0.000 0.000 0 167650.9 12.69 40.710758 35.1983 -111.6513 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 52.0 0 0.000 0.000 0 0.000 0.000 0 252952.8 2.50 206.564987 35.0844 -106.6504 2-4 SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 57.5 0 0.000 0.000 0 0.000 0.000 0 229330.7 9.61 257.905243 35.0844 -106.6504 8-10 W 255 270 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 60.1 0 0.000 0.000 0 0.000 0.000 0 231627.3 9.39 257.619263 35.0844 -106.6504 8-10 W 255 270 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 61.9 0 0.000 0.000 0 0.000 0.000 0 268044.6 11.13 239.826569 35.0844 -106.6504 10+ SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 64.4 0 0.000 0.000 0 0.000 0.000 0 247375.3 10.91 208.141510 35.0844 -106.6504 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 66.2 1 0.000 0.000 0 0.000 0.000 3 295275.6 10.55 201.124786 35.0844 -106.6504 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 69.3 1 0.000 0.000 0 0.000 0.000 3 295275.6 17.78 248.600128 35.0844 -106.6504 10+ W 240 270 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 70.5 1 0.000 0.000 0 0.000 0.000 3 295275.6 17.45 229.159729 35.0844 -106.6504 10+ SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 70.4 2 0.000 0.000 0 0.000 0.000 2 295275.6 16.65 239.300354 35.0844 -106.6504 10+ SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 69.7 3 0.000 0.000 0 0.000 0.000 1 295275.6 13.51 257.574066 35.0844 -106.6504 10+ W 255 270 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 66.2 4 0.000 0.000 0 0.000 0.000 0 295275.6 19.47 268.683105 35.0844 -106.6504 10+ W 255 270 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 64.9 6 0.000 0.000 0 0.000 0.000 3 295275.6 13.10 277.853210 35.0844 -106.6504 10+ W 270 270 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 60.9 4 0.000 0.000 0 0.000 0.000 3 250984.3 10.36 327.339111 35.0844 -106.6504 10+ NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 53.4 2 0.000 0.000 0 0.000 0.000 1 151902.9 11.91 25.602148 35.0844 -106.6504 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 50.8 2 0.000 0.000 0 0.000 0.000 0 131889.8 9.06 15.751240 35.0844 -106.6504 8-10 N 15 0 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 49.0 2 0.000 0.000 0 0.000 0.000 0 123031.5 6.73 356.186005 35.0844 -106.6504 6-8 N 345 0 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 48.4 2 0.000 0.000 0 0.000 0.000 0 121063.0 4.97 352.234924 35.0844 -106.6504 4-6 N 345 0 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 46.3 2 0.000 0.000 0 0.000 0.000 0 113517.1 5.59 16.260281 35.0844 -106.6504 4-6 N 15 0 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 45.9 4 0.000 0.000 0 0.000 0.000 2 107611.5 4.89 15.945477 35.0844 -106.6504 4-6 N 15 0 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 44.9 7 0.000 0.000 0 0.000 0.000 3 101049.9 4.65 324.782318 35.0844 -106.6504 4-6 NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 47.4 9 0.000 0.000 0 0.000 0.000 3 124015.8 3.91 120.963684 35.0844 -106.6504 2-4 SE 120 135 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 47.1 12 0.000 0.000 0 0.000 0.000 3 117782.2 4.41 30.465475 35.0844 -106.6504 4-6 NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 45.3 17 0.012 0.012 0 0.000 0.000 51 42650.9 5.59 270.000000 35.0844 -106.6504 4-6 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 42.5 19 0.028 0.028 0 0.000 0.000 53 31824.1 11.41 115.559921 35.0844 -106.6504 10+ SE 105 135 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 42.4 32 0.000 0.000 0 0.000 0.000 3 66929.1 2.38 131.185822 35.0844 -106.6504 2-4 SE 120 135 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 41.8 39 0.028 0.028 0 0.000 0.000 53 34120.7 3.48 224.999893 35.0844 -106.6504 2-4 SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 39.8 47 0.016 0.016 0 0.000 0.000 51 41994.8 3.13 270.000000 35.0844 -106.6504 2-4 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 41.3 48 0.043 0.043 0 0.000 0.000 55 20341.2 3.91 156.370605 35.0844 -106.6504 2-4 SE 150 135 Excellent (10-30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 42.7 40 0.028 0.028 0 0.000 0.000 53 30183.7 5.72 120.579147 35.0844 -106.6504 4-6 SE 120 135 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 43.8 36 0.028 0.028 0 0.000 0.000 53 34120.7 6.80 117.407494 35.0844 -106.6504 6-8 SE 105 135 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 54.6 0 0.000 0.000 0 0.000 0.000 1 258530.2 4.48 177.137650 34.9333 -104.6876 4-6 S 165 180 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 60.2 0 0.000 0.000 0 0.000 0.000 1 282808.4 4.22 212.005341 34.9333 -104.6876 4-6 SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 65.2 0 0.000 0.000 0 0.000 0.000 0 283792.7 6.02 211.328629 34.9333 -104.6876 6-8 SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 70.2 0 0.000 0.000 0 0.000 0.000 0 284448.8 17.01 215.362549 34.9333 -104.6876 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 71.1 0 0.000 0.000 0 0.000 0.000 1 295275.6 18.13 231.009003 34.9333 -104.6876 10+ SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 73.2 0 0.000 0.000 0 0.000 0.000 3 295275.6 17.32 241.448700 34.9333 -104.6876 10+ SW 240 225 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 73.6 0 0.000 0.000 0 0.000 0.000 3 295275.6 23.98 252.071991 34.9333 -104.6876 10+ W 240 270 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 73.7 0 0.000 0.000 0 0.000 0.000 3 295275.6 17.42 245.738708 34.9333 -104.6876 10+ SW 240 225 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 74.5 0 0.000 0.000 0 0.000 0.000 3 295275.6 22.78 234.593048 34.9333 -104.6876 10+ SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 73.2 0 0.000 0.000 0 0.000 0.000 0 295275.6 26.12 213.826202 34.9333 -104.6876 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 72.3 0 0.000 0.000 0 0.000 0.000 3 295275.6 20.09 225.451080 34.9333 -104.6876 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 69.2 0 0.000 0.000 0 0.000 0.000 0 295275.6 15.35 239.322784 34.9333 -104.6876 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 64.5 0 0.000 0.000 0 0.000 0.000 0 295275.6 13.29 226.363861 34.9333 -104.6876 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 60.9 0 0.000 0.000 0 0.000 0.000 0 295275.6 9.51 228.814178 34.9333 -104.6876 8-10 SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 58.1 1 0.000 0.000 0 0.000 0.000 0 295275.6 8.02 239.858688 34.9333 -104.6876 8-10 SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 53.6 1 0.000 0.000 0 0.000 0.000 0 173556.4 19.68 81.501526 34.9333 -104.6876 10+ E 75 90 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 49.5 1 0.000 0.000 0 0.000 0.000 0 120406.8 20.74 47.185818 34.9333 -104.6876 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 46.4 1 0.000 0.000 0 0.000 0.000 0 104330.7 19.01 47.862484 34.9333 -104.6876 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 44.6 1 0.000 0.000 0 0.000 0.000 0 96456.7 16.91 52.523746 34.9333 -104.6876 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 43.2 1 0.000 0.000 0 0.000 0.000 0 91863.5 13.71 56.309898 34.9333 -104.6876 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 41.8 1 0.000 0.000 0 0.000 0.000 0 87926.5 10.80 50.042519 34.9333 -104.6876 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 41.3 1 0.000 0.000 0 0.000 0.000 0 89895.0 9.31 54.782326 34.9333 -104.6876 8-10 NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 41.2 1 0.000 0.000 0 0.000 0.000 3 91207.4 12.35 58.324585 34.9333 -104.6876 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 40.4 2 0.000 0.000 0 0.000 0.000 2 88254.6 11.81 62.949482 34.9333 -104.6876 10+ NE 60 45 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 41.2 3 0.000 0.000 0 0.000 0.000 2 97440.9 14.22 65.854462 34.9333 -104.6876 10+ NE 60 45 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 42.8 4 0.000 0.000 0 0.000 0.000 2 99737.5 13.42 66.425285 34.9333 -104.6876 10+ NE 60 45 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 44.5 3 0.000 0.000 0 0.000 0.000 3 110236.2 12.52 71.241257 34.9333 -104.6876 10+ E 60 90 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 46.9 5 0.000 0.000 0 0.000 0.000 3 123687.7 12.07 79.315140 34.9333 -104.6876 10+ E 75 90 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 51.0 8 0.000 0.000 0 0.000 0.000 2 142060.4 9.63 87.337059 34.9333 -104.6876 8-10 E 75 90 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 54.2 8 0.000 0.000 0 0.000 0.000 1 158464.6 10.30 92.489502 34.9333 -104.6876 10+ E 90 90 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 45.4 1 0.000 0.000 0 0.000 0.000 3 86614.2 18.45 6.263397 35.2210 -101.8313 10+ N 0 0 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 42.8 0 0.000 0.000 0 0.000 0.000 3 91863.5 17.72 4.343158 35.2210 -101.8313 10+ N 0 0 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 43.1 0 0.000 0.000 0 0.000 0.000 3 85629.9 15.27 10.980613 35.2210 -101.8313 10+ N 0 0 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 45.9 0 0.000 0.000 0 0.000 0.000 3 86942.3 16.56 358.451874 35.2210 -101.8313 10+ N 345 0 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 48.6 1 0.000 0.000 0 0.000 0.000 3 97440.9 11.76 21.194136 35.2210 -101.8313 10+ N 15 0 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 54.3 0 0.000 0.000 0 0.000 0.000 3 132874.0 9.44 13.706991 35.2210 -101.8313 8-10 N 0 0 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 58.7 0 0.000 0.000 0 0.000 0.000 3 161745.4 10.46 41.531677 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 61.0 2 0.000 0.000 0 0.000 0.000 3 185367.5 10.89 19.179106 35.2210 -101.8313 10+ N 15 0 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 61.7 5 0.000 0.000 0 0.000 0.000 3 192913.4 15.35 53.297062 35.2210 -101.8313 10+ NE 45 45 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 60.5 4 0.000 0.000 0 0.000 0.000 3 191929.1 20.64 85.649010 35.2210 -101.8313 10+ E 75 90 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 60.4 5 0.000 0.000 0 0.000 0.000 3 191929.1 17.56 83.418152 35.2210 -101.8313 10+ E 75 90 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 58.9 3 0.000 0.000 0 0.000 0.000 3 177821.5 14.05 76.184952 35.2210 -101.8313 10+ E 75 90 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 57.0 1 0.000 0.000 0 0.000 0.000 3 175196.9 12.58 51.499329 35.2210 -101.8313 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 55.2 0 0.000 0.000 0 0.000 0.000 3 152559.1 13.40 56.575169 35.2210 -101.8313 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 53.2 0 0.000 0.000 0 0.000 0.000 3 119422.6 15.25 75.555931 35.2210 -101.8313 10+ E 75 90 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 50.4 0 0.000 0.000 0 0.000 0.000 3 79724.4 12.67 69.325500 35.2210 -101.8313 10+ E 60 90 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 48.4 0 0.000 0.000 0 0.000 0.000 3 73162.7 15.01 63.435013 35.2210 -101.8313 10+ NE 60 45 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 45.7 0 0.000 0.000 0 0.000 0.000 3 81692.9 13.76 45.658466 35.2210 -101.8313 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 43.7 0 0.000 0.000 0 0.000 0.000 2 77099.7 15.53 36.209553 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 43.8 0 0.000 0.000 0 0.000 0.000 3 81364.8 16.51 32.828541 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 43.7 2 0.000 0.000 0 0.000 0.000 3 88582.7 17.85 37.875053 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 43.6 5 0.000 0.000 0 0.000 0.000 3 93832.0 16.14 46.123219 35.2210 -101.8313 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 43.4 2 0.000 0.000 0 0.000 0.000 2 96128.6 15.27 34.854527 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 41.2 1 0.000 0.000 0 0.000 0.000 3 131233.6 15.58 35.059513 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 41.7 2 0.000 0.000 0 0.000 0.000 3 125656.2 15.93 38.157276 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 42.5 0 0.000 0.000 0 0.000 0.000 3 125328.1 15.03 36.528946 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 43.5 0 0.000 0.000 0 0.000 0.000 3 120734.9 14.40 32.949219 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 44.6 1 0.000 0.000 0 0.000 0.000 3 119422.6 15.08 35.340195 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 46.6 1 0.000 0.000 0 0.000 0.000 3 122375.3 14.32 38.659828 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 49.1 0 0.000 0.000 0 0.000 0.000 3 129265.1 13.38 38.211071 35.2210 -101.8313 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 52.2 0 0.000 0.000 0 0.000 0.000 0 123031.5 20.84 345.068542 35.2161 -100.2491 10+ N 345 0 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 53.6 0 0.000 0.000 0 0.000 0.000 0 121391.1 18.61 350.311279 35.2161 -100.2491 10+ N 345 0 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 55.2 0 0.000 0.000 0 0.000 0.000 0 136154.9 18.95 348.424835 35.2161 -100.2491 10+ N 345 0 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 58.7 0 0.000 0.000 0 0.000 0.000 1 132874.0 16.45 352.971680 35.2161 -100.2491 10+ N 345 0 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 61.7 0 0.000 0.000 0 0.000 0.000 3 138123.4 13.95 344.180725 35.2161 -100.2491 10+ N 330 0 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 64.8 0 0.000 0.000 0 0.000 0.000 3 175524.9 11.99 351.416443 35.2161 -100.2491 10+ N 345 0 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 67.1 0 0.000 0.000 0 0.000 0.000 1 198818.9 12.09 357.878937 35.2161 -100.2491 10+ N 345 0 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 69.2 0 0.000 0.000 0 0.000 0.000 3 214895.0 10.58 13.448633 35.2161 -100.2491 10+ N 0 0 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 69.6 2 0.000 0.000 0 0.000 0.000 3 226049.9 11.55 21.595381 35.2161 -100.2491 10+ N 15 0 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 70.2 10 0.000 0.000 0 0.000 0.000 2 231627.3 10.20 15.255177 35.2161 -100.2491 10+ N 15 0 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 69.1 15 0.000 0.000 0 0.000 0.000 3 232611.5 13.01 49.185013 35.2161 -100.2491 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 63.3 26 0.091 0.091 0 0.000 0.000 61 7874.0 12.75 1.005067 35.2161 -100.2491 10+ N 0 0 Good (5-10 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 57.4 29 0.008 0.008 0 0.000 0.000 51 75131.2 13.16 35.311302 35.2161 -100.2491 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 54.2 24 0.012 0.012 0 0.000 0.000 51 33136.5 18.49 55.348618 35.2161 -100.2491 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 52.5 7 0.000 0.000 0 0.000 0.000 3 64632.5 17.64 74.553627 35.2161 -100.2491 10+ E 60 90 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 51.3 1 0.000 0.000 0 0.000 0.000 3 54790.0 15.55 49.666939 35.2161 -100.2491 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 50.5 2 0.000 0.000 0 0.000 0.000 3 52493.4 14.87 44.999897 35.2161 -100.2491 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 49.2 3 0.000 0.000 0 0.000 0.000 2 50196.9 15.41 27.680971 35.2161 -100.2491 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 48.9 1 0.000 0.000 0 0.000 0.000 3 51509.2 14.42 23.782040 35.2161 -100.2491 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 48.4 1 0.000 0.000 0 0.000 0.000 3 51837.3 16.20 32.592571 35.2161 -100.2491 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 48.1 3 0.000 0.000 0 0.000 0.000 3 49540.7 15.41 27.680971 35.2161 -100.2491 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 47.9 1 0.000 0.000 0 0.000 0.000 3 54461.9 14.61 25.387871 35.2161 -100.2491 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 47.6 3 0.000 0.000 0 0.000 0.000 3 59383.2 15.09 15.478702 35.2161 -100.2491 10+ N 15 0 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 48.2 1 0.000 0.000 0 0.000 0.000 3 125656.2 18.51 26.564985 35.2161 -100.2491 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 47.8 3 0.000 0.000 0 0.000 0.000 3 125984.3 17.82 28.495539 35.2161 -100.2491 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 47.9 5 0.000 0.000 0 0.000 0.000 3 114829.4 17.73 29.475794 35.2161 -100.2491 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 48.0 0 0.000 0.000 0 0.000 0.000 3 105971.1 18.38 31.561775 35.2161 -100.2491 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 48.2 2 0.000 0.000 0 0.000 0.000 3 92519.7 18.92 24.443953 35.2161 -100.2491 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 47.9 5 0.000 0.000 0 0.000 0.000 3 80708.7 16.65 30.699654 35.2161 -100.2491 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 47.4 0 0.000 0.000 0 0.000 0.000 3 72178.5 15.62 29.134203 35.2161 -100.2491 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 70.2 0 0.000 0.000 0 0.000 0.000 3 57086.6 16.55 189.334930 35.4676 -97.5164 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 72.1 0 0.000 0.000 0 0.000 0.000 3 57414.7 15.50 200.265778 35.4676 -97.5164 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 75.1 0 0.000 0.000 0 0.000 0.000 2 66601.0 15.72 204.376450 35.4676 -97.5164 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 78.2 1 0.000 0.000 0 0.000 0.000 1 81364.8 12.54 214.824554 35.4676 -97.5164 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 68.8 1 0.000 0.000 0 0.000 0.000 3 91863.5 11.40 344.054535 35.4676 -97.5164 10+ N 330 0 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 73.0 5 0.000 0.000 0 0.000 0.000 3 103018.4 6.97 317.602600 35.4676 -97.5164 6-8 NW 315 315 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 73.3 4 0.000 0.000 0 0.000 0.000 3 113517.1 10.48 320.194489 35.4676 -97.5164 10+ NW 315 315 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 73.3 6 0.000 0.000 0 0.000 0.000 3 120734.9 10.20 333.996704 35.4676 -97.5164 10+ NW 330 315 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 71.0 9 0.000 0.000 0 0.000 0.000 3 107611.5 10.22 349.919464 35.4676 -97.5164 10+ N 345 0 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 70.3 13 0.000 0.000 0 0.000 0.000 3 105315.0 9.91 6.482988 35.4676 -97.5164 8-10 N 0 0 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 69.0 15 0.000 0.000 0 0.000 0.000 3 110564.3 10.05 20.854538 35.4676 -97.5164 10+ N 15 0 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 66.9 15 0.012 0.012 0 0.000 0.000 51 48556.4 9.52 9.462261 35.4676 -97.5164 8-10 N 0 0 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 62.4 20 0.035 0.035 0 0.000 0.000 53 63648.3 4.93 2.602512 35.4676 -97.5164 4-6 N 0 0 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 59.7 30 0.000 0.000 0 0.000 0.000 3 53149.6 12.97 44.999897 35.4676 -97.5164 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 58.5 55 0.051 0.051 0 0.000 0.000 61 41010.5 15.15 16.294130 35.4676 -97.5164 10+ N 15 0 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 55.6 53 0.047 0.047 0 0.000 0.000 55 37729.7 13.42 36.869980 35.4676 -97.5164 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 53.7 40 0.055 0.055 0 0.000 0.000 61 48228.3 13.16 35.311302 35.4676 -97.5164 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 53.3 47 0.000 0.000 0 0.000 0.000 3 43963.3 14.25 42.455162 35.4676 -97.5164 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 53.3 35 0.035 0.035 0 0.000 0.000 53 20013.1 9.69 71.146751 35.4676 -97.5164 8-10 E 60 90 Excellent (10-30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 53.8 20 0.063 0.063 0 0.000 0.000 61 42650.9 17.83 107.525658 35.4676 -97.5164 10+ E 105 90 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 54.4 20 0.000 0.000 0 0.000 0.000 3 41010.5 6.14 10.491434 35.4676 -97.5164 6-8 N 0 0 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 53.8 19 0.000 0.000 0 0.000 0.000 45 984.3 8.61 27.897186 35.4676 -97.5164 8-10 NE 15 45 Fog/Haze (<1 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 53.5 26 0.000 0.000 0 0.000 0.000 45 656.2 9.31 24.102238 35.4676 -97.5164 8-10 NE 15 45 Fog/Haze (<1 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 53.1 12 0.000 0.000 0 0.000 0.000 3 41338.6 11.47 20.556128 35.4676 -97.5164 10+ N 15 0 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 53.1 13 0.016 0.016 0 0.000 0.000 51 41010.5 10.93 30.762655 35.4676 -97.5164 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 54.0 20 0.016 0.016 0 0.000 0.000 51 41994.8 6.73 15.422230 35.4676 -97.5164 6-8 N 15 0 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 54.6 14 0.000 0.000 0 0.000 0.000 3 41338.6 12.18 44.256035 35.4676 -97.5164 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 54.8 19 0.055 0.055 0 0.000 0.000 61 26574.8 9.89 52.352322 35.4676 -97.5164 8-10 NE 45 45 Excellent (10-30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 55.6 24 0.016 0.016 0 0.000 0.000 51 40354.3 8.32 53.746078 35.4676 -97.5164 8-10 NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 56.0 27 0.000 0.000 0 0.000 0.000 3 40026.2 9.71 28.926332 35.4676 -97.5164 8-10 NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 71.1 0 0.000 0.000 0 0.000 0.000 1 58727.0 20.29 194.036270 36.7538 -95.2206 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 72.4 0 0.000 0.000 0 0.000 0.000 0 68569.6 23.15 200.361679 36.7538 -95.2206 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 74.4 1 0.000 0.000 0 0.000 0.000 3 83005.3 20.33 204.026505 36.7538 -95.2206 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 72.9 4 0.000 0.000 0 0.000 0.000 3 83989.5 16.92 204.193207 36.7538 -95.2206 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 71.0 4 0.000 0.000 0 0.000 0.000 3 53149.6 15.54 202.873703 36.7538 -95.2206 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 77.4 3 0.000 0.000 0 0.000 0.000 3 80708.7 18.33 199.983200 36.7538 -95.2206 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 78.9 10 0.000 0.000 0 0.000 0.000 3 90879.3 19.41 207.450912 36.7538 -95.2206 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 80.3 14 0.000 0.000 0 0.000 0.000 3 100393.7 17.45 202.619904 36.7538 -95.2206 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 71.0 18 0.000 0.000 0 0.000 0.000 3 85629.9 15.27 320.946869 36.7538 -95.2206 10+ NW 315 315 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 68.3 12 0.000 0.000 0 0.000 0.000 3 88582.7 12.97 316.397095 36.7538 -95.2206 10+ NW 315 315 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 66.9 15 0.000 0.000 0 0.000 0.000 3 96784.8 11.00 333.435028 36.7538 -95.2206 10+ NW 330 315 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 65.3 13 0.000 0.000 0 0.000 0.000 3 98753.3 10.49 326.309906 36.7538 -95.2206 10+ NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 63.6 13 0.000 0.000 0 0.000 0.000 3 91535.4 8.97 4.289077 36.7538 -95.2206 8-10 N 0 0 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 63.5 19 0.000 0.000 0 0.000 0.000 3 92847.8 11.41 11.309896 36.7538 -95.2206 10+ N 0 0 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 58.0 42 0.110 0.110 0 0.000 0.000 63 9842.5 15.91 25.844334 36.7538 -95.2206 10+ NE 15 45 Good (5-10 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 56.0 72 0.122 0.122 0 0.000 0.000 63 18700.8 18.92 6.788885 36.7538 -95.2206 10+ N 0 0 Excellent (10-30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 54.5 80 0.067 0.067 0 0.000 0.000 61 11811.0 20.12 28.559525 36.7538 -95.2206 10+ NE 15 45 Excellent (10-30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 54.1 72 0.417 0.417 0 0.000 0.000 65 12467.2 13.85 31.122416 36.7538 -95.2206 10+ NE 30 45 Excellent (10-30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 53.7 68 0.228 0.228 0 0.000 0.000 63 16404.2 13.14 42.929970 36.7538 -95.2206 10+ NE 30 45 Excellent (10-30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 53.6 58 0.087 0.087 0 0.000 0.000 61 41666.7 15.21 61.927620 36.7538 -95.2206 10+ NE 60 45 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 53.8 61 0.004 0.004 0 0.000 0.000 51 42322.8 17.34 83.333435 36.7538 -95.2206 10+ E 75 90 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 54.2 39 0.043 0.043 0 0.000 0.000 55 20997.4 15.41 99.188766 36.7538 -95.2206 10+ E 90 90 Excellent (10-30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 54.6 31 0.012 0.012 0 0.000 0.000 51 42322.8 5.65 56.309898 36.7538 -95.2206 4-6 NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 56.2 37 0.000 0.000 0 0.000 0.000 3 42979.0 7.38 360.000000 36.7538 -95.2206 6-8 N 345 0 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 55.4 54 0.016 0.016 0 0.000 0.000 51 44619.4 12.59 19.722366 36.7538 -95.2206 10+ N 15 0 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 54.5 35 0.000 0.000 0 0.000 0.000 3 45275.6 18.74 33.310646 36.7538 -95.2206 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 55.5 38 0.016 0.016 0 0.000 0.000 51 47244.1 15.70 40.955414 36.7538 -95.2206 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 55.8 31 0.000 0.000 0 0.000 0.000 3 46587.9 13.65 55.007900 36.7538 -95.2206 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 57.3 24 0.016 0.016 0 0.000 0.000 51 45931.8 13.16 58.201138 36.7538 -95.2206 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 58.4 42 0.071 0.071 0 0.000 0.000 61 21981.6 8.36 74.475830 36.7538 -95.2206 8-10 E 60 90 Excellent (10-30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 71.4 0 0.000 0.000 0 0.000 0.000 3 69881.9 18.49 201.286484 37.0842 -94.5133 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 74.0 0 0.000 0.000 0 0.000 0.000 3 72834.6 19.22 204.775116 37.0842 -94.5133 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 75.8 0 0.000 0.000 0 0.000 0.000 3 87270.3 20.03 209.427368 37.0842 -94.5133 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 74.1 2 0.000 0.000 0 0.000 0.000 3 86942.3 16.13 203.720398 37.0842 -94.5133 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 72.3 7 0.000 0.000 0 0.000 0.000 3 67913.4 15.73 209.845840 37.0842 -94.5133 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 75.6 3 0.000 0.000 0 0.000 0.000 3 83333.3 17.07 211.607452 37.0842 -94.5133 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 77.8 9 0.000 0.000 0 0.000 0.000 3 86286.1 14.73 210.068497 37.0842 -94.5133 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 79.5 14 0.000 0.000 0 0.000 0.000 3 94160.1 15.32 213.690094 37.0842 -94.5133 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 79.2 18 0.000 0.000 0 0.000 0.000 3 103346.5 15.89 215.256439 37.0842 -94.5133 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 71.9 24 0.000 0.000 0 0.000 0.000 3 74147.0 11.77 308.829834 37.0842 -94.5133 10+ NW 300 315 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 66.5 19 0.000 0.000 0 0.000 0.000 3 68241.5 11.29 303.690094 37.0842 -94.5133 10+ NW 300 315 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 63.6 15 0.000 0.000 0 0.000 0.000 3 67257.2 6.65 340.346100 37.0842 -94.5133 6-8 N 330 0 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 62.9 15 0.000 0.000 0 0.000 0.000 3 67257.2 10.09 347.195740 37.0842 -94.5133 10+ N 345 0 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 61.5 14 0.000 0.000 0 0.000 0.000 3 73162.7 10.97 11.768270 37.0842 -94.5133 10+ N 0 0 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 60.2 33 0.000 0.000 0 0.000 0.000 3 69553.8 13.37 17.525654 37.0842 -94.5133 10+ N 15 0 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 54.7 49 0.390 0.390 0 0.000 0.000 65 9514.4 18.42 24.386360 37.0842 -94.5133 10+ NE 15 45 Good (5-10 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 53.5 71 0.004 0.004 0 0.000 0.000 51 45603.7 14.92 23.875284 37.0842 -94.5133 10+ NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 52.7 81 0.067 0.067 0 0.000 0.000 61 31168.0 9.21 29.054508 37.0842 -94.5133 8-10 NE 15 45 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 52.5 72 0.350 0.350 0 0.000 0.000 65 8530.2 10.60 44.145004 37.0842 -94.5133 10+ NE 30 45 Good (5-10 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 53.0 59 0.264 0.264 0 0.000 0.000 63 7217.8 5.75 76.504250 37.0842 -94.5133 4-6 E 75 90 Good (5-10 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 53.1 60 0.063 0.063 0 0.000 0.000 61 41666.7 13.37 72.474342 37.0842 -94.5133 10+ E 60 90 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 54.0 54 0.008 0.008 0 0.000 0.000 51 41666.7 7.76 33.231728 37.0842 -94.5133 6-8 NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 54.6 25 0.087 0.087 0 0.000 0.000 61 21981.6 8.91 101.592148 37.0842 -94.5133 8-10 E 90 90 Excellent (10-30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 55.3 37 0.000 0.000 0 0.000 0.000 3 40026.2 10.15 14.036275 37.0842 -94.5133 10+ N 0 0 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 53.9 52 0.043 0.043 0 0.000 0.000 55 30839.9 13.65 10.388804 37.0842 -94.5133 10+ N 0 0 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 53.7 63 0.142 0.142 0 0.000 0.000 63 13779.5 15.27 39.053139 37.0842 -94.5133 10+ NE 30 45 Excellent (10-30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 53.9 45 0.016 0.016 0 0.000 0.000 51 41994.8 13.01 40.814987 37.0842 -94.5133 10+ NE 30 45 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 55.9 45 0.000 0.000 0 0.000 0.000 3 44291.3 10.36 57.339100 37.0842 -94.5133 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 56.5 40 0.016 0.016 0 0.000 0.000 51 43307.1 10.05 57.724377 37.0842 -94.5133 10+ NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 57.1 50 0.055 0.055 0 0.000 0.000 61 22965.9 6.14 33.111355 37.0842 -94.5133 6-8 NE 30 45 Excellent (10-30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 70.0 2 0.000 0.000 0 0.000 0.000 2 66929.1 8.33 173.829926 38.7480 -90.4390 8-10 S 165 180 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 73.6 0 0.000 0.000 0 0.000 0.000 3 78084.0 11.41 178.876724 38.7480 -90.4390 10+ S 165 180 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 74.5 0 0.000 0.000 0 0.000 0.000 3 85629.9 12.13 174.710007 38.7480 -90.4390 10+ S 165 180 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 76.6 0 0.000 0.000 0 0.000 0.000 3 98425.2 12.99 182.960876 38.7480 -90.4390 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 79.0 0 0.000 0.000 0 0.000 0.000 3 101049.9 13.80 196.966232 38.7480 -90.4390 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 77.9 1 0.000 0.000 0 0.000 0.000 3 101378.0 11.32 217.775742 38.7480 -90.4390 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 77.2 6 0.000 0.000 0 0.000 0.000 3 104330.7 8.93 202.067947 38.7480 -90.4390 8-10 S 195 180 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 77.7 9 0.000 0.000 0 0.000 0.000 3 102362.2 9.56 196.313934 38.7480 -90.4390 8-10 S 195 180 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 77.2 9 0.000 0.000 0 0.000 0.000 3 102034.1 6.19 192.528793 38.7480 -90.4390 6-8 S 180 180 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 79.2 19 0.000 0.000 0 0.000 0.000 3 109252.0 9.71 187.943375 38.7480 -90.4390 8-10 S 180 180 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 76.7 18 0.000 0.000 0 0.000 0.000 3 108595.8 9.56 196.313934 38.7480 -90.4390 8-10 S 195 180 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 73.9 18 0.000 0.000 0 0.000 0.000 3 88910.8 4.78 190.784256 38.7480 -90.4390 4-6 S 180 180 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 72.1 27 0.000 0.000 0 0.000 0.000 3 75459.3 5.92 190.885483 38.7480 -90.4390 4-6 S 180 180 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 70.6 38 0.091 0.091 0 0.000 0.000 61 6561.7 0.32 135.000107 38.7480 -90.4390 0-2 SE 135 135 Good (5-10 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 67.7 37 0.209 0.209 0 0.000 0.000 63 10826.8 5.24 289.983185 38.7480 -90.4390 4-6 W 285 270 Excellent (10-30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 66.6 36 0.020 0.020 0 0.000 0.000 53 40026.2 8.28 288.924744 38.7480 -90.4390 8-10 W 285 270 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 63.1 51 0.008 0.008 0 0.000 0.000 51 46259.8 10.38 307.116943 38.7480 -90.4390 10+ NW 300 315 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 59.0 38 0.102 0.102 0 0.000 0.000 63 18700.8 18.31 308.550507 38.7480 -90.4390 10+ NW 300 315 Excellent (10-30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 58.1 66 0.122 0.122 0 0.000 0.000 63 6889.8 6.49 316.397095 38.7480 -90.4390 6-8 NW 315 315 Good (5-10 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 56.7 89 0.205 0.205 0 0.000 0.000 63 21325.5 16.07 16.164576 38.7480 -90.4390 10+ N 15 0 Excellent (10-30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 56.8 89 0.154 0.154 0 0.000 0.000 63 8202.1 4.59 316.974915 38.7480 -90.4390 4-6 NW 315 315 Good (5-10 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 56.5 92 0.177 0.177 0 0.000 0.000 63 8530.2 8.86 315.000092 38.7480 -90.4390 8-10 NW 315 315 Good (5-10 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 55.4 84 0.169 0.169 0 0.000 0.000 63 15748.0 4.61 284.036255 38.7480 -90.4390 4-6 W 270 270 Excellent (10-30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 54.7 70 0.000 0.000 0 0.000 0.000 3 41666.7 7.16 358.210144 38.7480 -90.4390 6-8 N 345 0 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 55.2 56 0.016 0.016 0 0.000 0.000 51 43963.3 4.91 46.847599 38.7480 -90.4390 4-6 NE 45 45 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 55.9 49 0.043 0.043 0 0.000 0.000 55 34120.7 7.64 354.957642 38.7480 -90.4390 6-8 N 345 0 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 54.5 57 0.028 0.028 0 0.000 0.000 53 36745.4 8.14 15.945477 38.7480 -90.4390 8-10 N 15 0 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 54.3 71 0.055 0.055 0 0.000 0.000 61 22309.7 6.37 18.435053 38.7480 -90.4390 6-8 N 15 0 Excellent (10-30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 54.7 69 0.028 0.028 0 0.000 0.000 53 30839.9 7.38 14.036275 38.7480 -90.4390 6-8 N 0 0 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 54.7 62 0.087 0.087 0 0.000 0.000 61 16732.3 8.83 8.746089 38.7480 -90.4390 8-10 N 0 0 Excellent (10-30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 68.7 1 0.000 0.000 0 0.000 0.000 2 75131.2 14.79 162.387329 39.1200 -88.5435 10+ S 150 180 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 69.2 2 0.000 0.000 0 0.000 0.000 3 76443.6 16.93 172.405441 39.1200 -88.5435 10+ S 165 180 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 72.0 1 0.000 0.000 0 0.000 0.000 0 68897.6 18.01 186.418686 39.1200 -88.5435 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 75.4 1 0.000 0.000 0 0.000 0.000 2 91535.4 17.47 166.675461 39.1200 -88.5435 10+ S 165 180 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 75.4 15 0.000 0.000 0 0.000 0.000 3 79068.2 20.86 184.304382 39.1200 -88.5435 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 76.3 3 0.000 0.000 0 0.000 0.000 1 83989.5 21.65 193.749069 39.1200 -88.5435 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 76.6 1 0.000 0.000 0 0.000 0.000 2 92847.8 19.37 216.076096 39.1200 -88.5435 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 75.0 2 0.000 0.000 0 0.000 0.000 3 91863.5 15.35 223.228561 39.1200 -88.5435 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 76.3 6 0.000 0.000 0 0.000 0.000 3 98753.3 14.08 225.643661 39.1200 -88.5435 10+ SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 75.4 10 0.000 0.000 0 0.000 0.000 3 97440.9 12.52 204.274429 39.1200 -88.5435 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 73.4 14 0.000 0.000 0 0.000 0.000 3 86614.2 10.19 199.230759 39.1200 -88.5435 10+ S 195 180 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 70.9 19 0.000 0.000 0 0.000 0.000 3 74803.1 5.97 192.994614 39.1200 -88.5435 4-6 S 180 180 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 70.4 20 0.000 0.000 0 0.000 0.000 3 72506.6 9.85 177.397491 39.1200 -88.5435 8-10 S 165 180 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 70.0 18 0.000 0.000 0 0.000 0.000 3 68569.6 10.63 188.471054 39.1200 -88.5435 10+ S 180 180 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 69.8 29 0.004 0.004 0 0.000 0.000 51 65944.9 9.13 210.963684 39.1200 -88.5435 8-10 SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 67.6 57 0.390 0.390 0 0.000 0.000 65 2952.8 17.26 266.284790 39.1200 -88.5435 10+ W 255 270 Moderate (2-5 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 65.9 45 0.382 0.382 0 0.000 0.000 65 12139.1 8.13 238.495789 39.1200 -88.5435 8-10 SW 225 225 Excellent (10-30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 66.1 68 0.000 0.000 0 0.000 0.000 3 42650.9 10.33 197.650208 39.1200 -88.5435 10+ S 195 180 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 66.0 56 0.075 0.075 0 0.000 0.000 61 40026.2 5.10 254.744827 39.1200 -88.5435 4-6 W 240 270 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 61.6 43 0.043 0.043 0 0.000 0.000 55 45275.6 15.98 316.701324 39.1200 -88.5435 10+ NW 315 315 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 59.1 76 0.110 0.110 0 0.000 0.000 63 32152.2 12.91 295.676758 39.1200 -88.5435 10+ NW 285 315 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 58.4 87 0.028 0.028 0 0.000 0.000 53 41338.6 7.23 291.801483 39.1200 -88.5435 6-8 W 285 270 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 58.2 99 0.012 0.012 0 0.000 0.000 51 29855.6 7.30 297.349792 39.1200 -88.5435 6-8 NW 285 315 Excellent (10-30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 59.8 99 0.098 0.098 0 0.000 0.000 63 15419.9 6.14 280.491425 39.1200 -88.5435 6-8 W 270 270 Excellent (10-30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 59.4 86 0.043 0.043 0 0.000 0.000 55 29855.6 5.22 350.134247 39.1200 -88.5435 4-6 N 345 0 Excellent (10-30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 58.4 72 0.028 0.028 0 0.000 0.000 53 39042.0 5.42 308.290192 39.1200 -88.5435 4-6 NW 300 315 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 60.1 79 0.028 0.028 0 0.000 0.000 53 32480.3 6.44 159.676773 39.1200 -88.5435 6-8 S 150 180 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 60.6 66 0.142 0.142 0 0.000 0.000 63 12467.2 6.08 276.340088 39.1200 -88.5435 6-8 W 270 270 Excellent (10-30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 58.1 49 0.055 0.055 0 0.000 0.000 61 25262.5 8.96 357.137665 39.1200 -88.5435 8-10 N 345 0 Excellent (10-30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 57.8 50 0.028 0.028 0 0.000 0.000 53 38385.8 7.61 358.315338 39.1200 -88.5435 6-8 N 345 0 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 71.8 0 0.000 0.000 0 0.000 0.000 0 123359.6 15.71 197.402786 39.7684 -86.1581 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 74.3 0 0.000 0.000 0 0.000 0.000 0 112204.7 17.81 206.886856 39.7684 -86.1581 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 76.4 0 0.000 0.000 0 0.000 0.000 3 101706.0 15.79 187.326309 39.7684 -86.1581 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 80.0 1 0.000 0.000 0 0.000 0.000 2 116797.9 16.48 198.189133 39.7684 -86.1581 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 80.9 1 0.000 0.000 0 0.000 0.000 3 131233.6 15.91 205.844330 39.7684 -86.1581 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 79.9 1 0.000 0.000 0 0.000 0.000 3 131561.7 17.28 201.250580 39.7684 -86.1581 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 79.7 1 0.000 0.000 0 0.000 0.000 3 127624.7 17.55 197.049118 39.7684 -86.1581 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 78.3 8 0.000 0.000 0 0.000 0.000 3 111220.5 16.92 204.193207 39.7684 -86.1581 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 78.1 6 0.000 0.000 0 0.000 0.000 3 111220.5 19.56 215.690155 39.7684 -86.1581 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 76.5 4 0.000 0.000 0 0.000 0.000 3 101049.9 14.88 227.436691 39.7684 -86.1581 10+ SW 225 225 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 75.2 9 0.000 0.000 0 0.000 0.000 3 92847.8 14.11 205.346130 39.7684 -86.1581 10+ SW 195 225 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 73.9 5 0.000 0.000 0 0.000 0.000 3 88254.6 12.71 206.113846 39.7684 -86.1581 10+ SW 195 225 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 72.8 6 0.000 0.000 0 0.000 0.000 3 83989.5 11.31 204.537704 39.7684 -86.1581 10+ SW 195 225 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 71.9 21 0.000 0.000 0 0.000 0.000 3 78412.1 13.09 199.983200 39.7684 -86.1581 10+ S 195 180 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 71.6 29 0.000 0.000 0 0.000 0.000 3 80380.6 17.01 204.880341 39.7684 -86.1581 10+ SW 195 225 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 71.5 22 0.000 0.000 0 0.000 0.000 3 77427.8 14.23 210.191528 39.7684 -86.1581 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 70.8 25 0.000 0.000 0 0.000 0.000 3 73818.9 13.62 209.511398 39.7684 -86.1581 10+ SW 195 225 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 68.1 60 0.035 0.035 0 0.000 0.000 53 16732.3 16.33 233.914825 39.7684 -86.1581 10+ SW 225 225 Excellent (10-30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 65.7 50 0.039 0.039 0 0.000 0.000 55 34120.7 9.05 230.013168 39.7684 -86.1581 8-10 SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 65.8 53 0.000 0.000 0 0.000 0.000 3 50853.0 11.50 243.435013 39.7684 -86.1581 10+ SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 64.7 46 0.012 0.012 0 0.000 0.000 51 43635.2 3.33 227.726379 39.7684 -86.1581 2-4 SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 64.4 67 0.051 0.051 0 0.000 0.000 61 6889.8 9.50 285.018402 39.7684 -86.1581 8-10 W 285 270 Good (5-10 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 62.6 72 0.039 0.039 0 0.000 0.000 55 47900.3 8.13 262.092926 39.7684 -86.1581 8-10 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 62.0 85 0.299 0.299 0 0.000 0.000 65 8202.1 9.52 260.537750 39.7684 -86.1581 8-10 W 255 270 Good (5-10 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 61.0 92 0.157 0.157 0 0.000 0.000 63 13451.4 10.63 239.656830 39.7684 -86.1581 10+ SW 225 225 Excellent (10-30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 62.1 78 0.000 0.000 0 0.000 0.000 3 46916.0 8.72 247.380096 39.7684 -86.1581 8-10 SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 63.4 67 0.071 0.071 0 0.000 0.000 61 21325.5 10.55 212.005341 39.7684 -86.1581 10+ SW 210 225 Excellent (10-30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 64.8 59 0.016 0.016 0 0.000 0.000 51 59383.2 10.28 224.118683 39.7684 -86.1581 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 65.4 37 0.000 0.000 0 0.000 0.000 3 57086.6 10.67 236.976120 39.7684 -86.1581 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 65.3 33 0.000 0.000 0 0.000 0.000 3 54133.9 8.20 258.996490 39.7684 -86.1581 8-10 W 255 270 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 71.9 0 0.000 0.000 0 0.000 0.000 0 174868.8 18.68 196.699326 39.7589 -84.1916 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 74.8 0 0.000 0.000 0 0.000 0.000 1 159776.9 20.15 202.864548 39.7589 -84.1916 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 77.2 0 0.000 0.000 0 0.000 0.000 0 134514.4 18.42 204.386368 39.7589 -84.1916 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 79.1 0 0.000 0.000 0 0.000 0.000 2 132874.0 17.61 205.588470 39.7589 -84.1916 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 80.9 0 0.000 0.000 0 0.000 0.000 1 161089.2 18.35 189.117783 39.7589 -84.1916 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 81.2 0 0.000 0.000 0 0.000 0.000 3 146653.5 18.84 195.851990 39.7589 -84.1916 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 80.9 0 0.000 0.000 0 0.000 0.000 3 158792.7 19.21 206.266571 39.7589 -84.1916 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 79.6 1 0.000 0.000 0 0.000 0.000 3 155183.7 15.90 193.840714 39.7589 -84.1916 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 78.8 2 0.000 0.000 0 0.000 0.000 3 159448.8 16.34 199.179108 39.7589 -84.1916 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 77.6 1 0.000 0.000 0 0.000 0.000 3 152887.1 16.41 205.866302 39.7589 -84.1916 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 74.4 4 0.000 0.000 0 0.000 0.000 3 126968.5 11.83 195.350189 39.7589 -84.1916 10+ S 195 180 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 73.1 3 0.000 0.000 0 0.000 0.000 3 115813.6 12.51 206.564987 39.7589 -84.1916 10+ SW 195 225 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 72.2 4 0.000 0.000 0 0.000 0.000 3 101706.0 13.11 207.439636 39.7589 -84.1916 10+ SW 195 225 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 71.9 5 0.000 0.000 0 0.000 0.000 3 91207.4 12.21 206.095367 39.7589 -84.1916 10+ SW 195 225 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 71.9 6 0.000 0.000 0 0.000 0.000 3 86286.1 12.75 201.614838 39.7589 -84.1916 10+ S 195 180 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 71.0 17 0.000 0.000 0 0.000 0.000 3 84973.8 12.72 214.249084 39.7589 -84.1916 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 70.4 20 0.000 0.000 0 0.000 0.000 3 85958.0 12.93 217.266479 39.7589 -84.1916 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 69.7 18 0.000 0.000 0 0.000 0.000 3 82677.2 11.79 213.388535 39.7589 -84.1916 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 70.0 26 0.000 0.000 0 0.000 0.000 3 79396.3 14.02 213.943634 39.7589 -84.1916 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 70.6 39 0.000 0.000 0 0.000 0.000 3 75459.3 14.29 230.079666 39.7589 -84.1916 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 68.7 46 0.012 0.012 0 0.000 0.000 51 63976.4 10.92 227.489594 39.7589 -84.1916 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 67.7 31 0.000 0.000 0 0.000 0.000 3 62336.0 10.60 224.144989 39.7589 -84.1916 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 67.0 31 0.004 0.004 0 0.000 0.000 51 54133.9 10.74 215.676498 39.7589 -84.1916 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 66.4 39 0.000 0.000 0 0.000 0.000 3 52821.5 12.17 216.027466 39.7589 -84.1916 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 63.8 63 0.709 0.709 0 0.000 0.000 65 4921.3 14.15 230.774338 39.7589 -84.1916 10+ SW 225 225 Moderate (2-5 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 64.7 84 0.169 0.169 0 0.000 0.000 63 11154.9 15.51 236.768280 39.7589 -84.1916 10+ SW 225 225 Excellent (10-30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 66.6 80 0.000 0.000 0 0.000 0.000 3 63976.4 10.50 243.435013 39.7589 -84.1916 10+ SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 69.1 42 0.000 0.000 0 0.000 0.000 3 73162.7 12.29 236.888641 39.7589 -84.1916 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 66.5 30 0.000 0.000 0 0.000 0.000 3 65288.7 8.70 223.958466 39.7589 -84.1916 8-10 SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 67.9 15 0.000 0.000 0 0.000 0.000 3 68897.6 11.43 210.579147 39.7589 -84.1916 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 66.0 1 0.000 0.000 0 0.000 0.000 0 187336.0 7.25 171.119415 40.4406 -79.9959 6-8 S 165 180 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 73.6 0 0.000 0.000 0 0.000 0.000 0 220144.4 11.81 189.819229 40.4406 -79.9959 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 77.4 0 0.000 0.000 0 0.000 0.000 0 208661.4 14.25 202.135544 40.4406 -79.9959 10+ S 195 180 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 79.7 0 0.000 0.000 0 0.000 0.000 1 207677.2 15.41 205.820938 40.4406 -79.9959 10+ SW 195 225 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 83.5 0 0.000 0.000 0 0.000 0.000 0 209973.8 16.27 211.504211 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 84.0 0 0.000 0.000 0 0.000 0.000 0 229658.8 16.04 219.907837 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 84.5 0 0.000 0.000 0 0.000 0.000 0 237532.8 16.53 219.507645 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 84.1 0 0.000 0.000 0 0.000 0.000 2 238517.1 15.64 213.917465 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 83.6 0 0.000 0.000 0 0.000 0.000 0 255249.3 15.82 213.465408 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 81.5 0 0.000 0.000 0 0.000 0.000 2 253280.8 12.85 211.476791 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 77.2 1 0.000 0.000 0 0.000 0.000 3 240485.6 11.34 202.011337 40.4406 -79.9959 10+ S 195 180 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 74.3 1 0.000 0.000 0 0.000 0.000 3 223753.3 11.02 203.962494 40.4406 -79.9959 10+ SW 195 225 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 73.7 2 0.000 0.000 0 0.000 0.000 3 209973.8 10.69 217.349426 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 71.7 0 0.000 0.000 0 0.000 0.000 3 196850.4 6.22 217.694305 40.4406 -79.9959 6-8 SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 69.6 1 0.000 0.000 0 0.000 0.000 3 179790.0 6.34 227.862473 40.4406 -79.9959 6-8 SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 67.7 1 0.000 0.000 0 0.000 0.000 3 157152.2 7.73 202.109497 40.4406 -79.9959 6-8 S 195 180 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 66.7 2 0.000 0.000 0 0.000 0.000 3 130905.5 8.25 212.828537 40.4406 -79.9959 8-10 SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 67.1 2 0.000 0.000 0 0.000 0.000 3 122375.3 10.31 220.601212 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 66.9 5 0.000 0.000 0 0.000 0.000 3 134514.4 11.68 216.430954 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 66.8 5 0.000 0.000 0 0.000 0.000 3 125656.2 12.86 220.060715 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 67.3 8 0.000 0.000 0 0.000 0.000 3 116469.8 12.09 218.990997 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 66.9 10 0.000 0.000 0 0.000 0.000 3 109252.0 12.86 220.060715 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 67.2 28 0.000 0.000 0 0.000 0.000 3 92847.8 14.15 230.774338 40.4406 -79.9959 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 64.4 29 0.000 0.000 0 0.000 0.000 3 50853.0 8.14 200.924576 40.4406 -79.9959 8-10 S 195 180 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 65.4 11 0.000 0.000 0 0.000 0.000 3 55446.2 14.21 213.439880 40.4406 -79.9959 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 70.1 10 0.000 0.000 0 0.000 0.000 3 66929.1 15.34 225.590576 40.4406 -79.9959 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 70.9 10 0.000 0.000 0 0.000 0.000 3 70538.1 15.72 230.194473 40.4406 -79.9959 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 71.6 18 0.000 0.000 0 0.000 0.000 3 78084.0 16.81 236.944168 40.4406 -79.9959 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 68.0 36 0.000 0.000 0 0.000 0.000 3 68241.5 10.12 234.904114 40.4406 -79.9959 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 72.3 50 0.000 0.000 0 0.000 0.000 3 81692.9 15.41 242.319031 40.4406 -79.9959 10+ SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 58.0 0 0.000 0.000 0 0.000 0.000 3 153871.4 7.02 149.349411 39.9995 -78.2341 6-8 SE 135 135 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 61.5 0 0.000 0.000 0 0.000 0.000 2 171916.0 7.81 166.759476 39.9995 -78.2341 6-8 S 165 180 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 66.2 0 0.000 0.000 0 0.000 0.000 0 180118.1 8.94 148.298615 39.9995 -78.2341 8-10 SE 135 135 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 69.7 0 0.000 0.000 0 0.000 0.000 0 178477.7 12.62 150.255219 39.9995 -78.2341 10+ SE 150 135 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 73.4 0 0.000 0.000 0 0.000 0.000 0 179461.9 14.91 154.204025 39.9995 -78.2341 10+ SE 150 135 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 75.9 0 0.000 0.000 0 0.000 0.000 0 209973.8 13.13 156.929565 39.9995 -78.2341 10+ SE 150 135 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 77.8 0 0.000 0.000 0 0.000 0.000 0 216535.4 11.24 137.419540 39.9995 -78.2341 10+ SE 135 135 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 80.3 0 0.000 0.000 0 0.000 0.000 0 241797.9 11.74 172.333282 39.9995 -78.2341 10+ S 165 180 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 79.8 0 0.000 0.000 0 0.000 0.000 0 236548.6 9.72 156.974472 39.9995 -78.2341 8-10 SE 150 135 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 76.7 0 0.000 0.000 0 0.000 0.000 0 217191.6 10.44 170.134262 39.9995 -78.2341 10+ S 165 180 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 71.3 0 0.000 0.000 0 0.000 0.000 0 205708.7 11.93 173.541275 39.9995 -78.2341 10+ S 165 180 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 69.2 0 0.000 0.000 0 0.000 0.000 0 187664.0 12.43 171.724197 39.9995 -78.2341 10+ S 165 180 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 67.9 0 0.000 0.000 0 0.000 0.000 3 183070.9 12.78 175.985901 39.9995 -78.2341 10+ S 165 180 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 66.5 0 0.000 0.000 0 0.000 0.000 3 166666.7 11.63 180.000000 39.9995 -78.2341 10+ S 165 180 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 66.1 0 0.000 0.000 0 0.000 0.000 3 154527.6 8.50 181.507401 39.9995 -78.2341 8-10 S 180 180 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 63.9 1 0.000 0.000 0 0.000 0.000 3 145341.2 6.80 170.537750 39.9995 -78.2341 6-8 S 165 180 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 63.2 1 0.000 0.000 0 0.000 0.000 3 154199.5 7.69 171.634201 39.9995 -78.2341 6-8 S 165 180 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 63.0 1 0.000 0.000 0 0.000 0.000 3 153215.2 7.40 176.531845 39.9995 -78.2341 6-8 S 165 180 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 62.1 1 0.000 0.000 0 0.000 0.000 3 147637.8 6.97 174.472549 39.9995 -78.2341 6-8 S 165 180 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 61.5 2 0.000 0.000 0 0.000 0.000 3 146653.5 7.19 174.644272 39.9995 -78.2341 6-8 S 165 180 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 61.2 2 0.000 0.000 0 0.000 0.000 3 145669.3 7.00 153.435013 39.9995 -78.2341 6-8 SE 150 135 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 61.4 2 0.000 0.000 0 0.000 0.000 3 134186.4 6.27 182.045364 39.9995 -78.2341 6-8 S 180 180 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 64.3 3 0.000 0.000 0 0.000 0.000 3 122047.2 6.77 172.405441 39.9995 -78.2341 6-8 S 165 180 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 60.3 17 0.441 0.441 0 0.000 0.000 65 5905.5 17.59 262.694336 39.9995 -78.2341 10+ W 255 270 Good (5-10 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 61.2 15 0.000 0.000 0 0.000 0.000 3 56102.4 9.81 226.847595 39.9995 -78.2341 8-10 SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 67.2 10 0.000 0.000 0 0.000 0.000 3 68897.6 11.99 216.656204 39.9995 -78.2341 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 71.4 9 0.000 0.000 0 0.000 0.000 3 85629.9 14.83 236.070160 39.9995 -78.2341 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 73.7 4 0.000 0.000 0 0.000 0.000 3 104658.8 17.95 247.270233 39.9995 -78.2341 10+ SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 75.1 3 0.000 0.000 0 0.000 0.000 3 117126.0 20.81 243.159561 39.9995 -78.2341 10+ SW 240 225 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 73.4 4 0.000 0.000 0 0.000 0.000 3 103018.4 18.15 247.543015 39.9995 -78.2341 10+ W 240 270 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
2025-04-18 14:00:00 59.0 0 0.000 0.000 0 0.000 0.000 0 197178.5 5.22 170.134262 40.7357 -74.1724 4-6 S 165 180 Clearest (>30 km) 2025-04-18 2025 4 14 April Apr 18 Friday Fri Apr 18 14:00:00 1970-01-01 14:00:00
2025-04-18 15:00:00 65.3 0 0.000 0.000 0 0.000 0.000 0 224737.5 10.52 182.436600 40.7357 -74.1724 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 15 April Apr 18 Friday Fri Apr 18 15:00:00 1970-01-01 15:00:00
2025-04-18 16:00:00 67.9 0 0.000 0.000 0 0.000 0.000 0 227690.3 9.87 176.099579 40.7357 -74.1724 8-10 S 165 180 Clearest (>30 km) 2025-04-18 2025 4 16 April Apr 18 Friday Fri Apr 18 16:00:00 1970-01-01 16:00:00
2025-04-18 17:00:00 67.4 0 0.000 0.000 0 0.000 0.000 0 169619.4 11.50 153.435013 40.7357 -74.1724 10+ SE 150 135 Clearest (>30 km) 2025-04-18 2025 4 17 April Apr 18 Friday Fri Apr 18 17:00:00 1970-01-01 17:00:00
2025-04-18 18:00:00 70.4 0 0.000 0.000 0 0.000 0.000 3 192585.3 12.81 155.224884 40.7357 -74.1724 10+ SE 150 135 Clearest (>30 km) 2025-04-18 2025 4 18 April Apr 18 Friday Fri Apr 18 18:00:00 1970-01-01 18:00:00
2025-04-18 19:00:00 71.5 0 0.000 0.000 0 0.000 0.000 3 197834.6 13.37 162.474350 40.7357 -74.1724 10+ S 150 180 Clearest (>30 km) 2025-04-18 2025 4 19 April Apr 18 Friday Fri Apr 18 19:00:00 1970-01-01 19:00:00
2025-04-18 20:00:00 72.2 0 0.000 0.000 0 0.000 0.000 3 202755.9 11.02 156.037506 40.7357 -74.1724 10+ SE 150 135 Clearest (>30 km) 2025-04-18 2025 4 20 April Apr 18 Friday Fri Apr 18 20:00:00 1970-01-01 20:00:00
2025-04-18 21:00:00 74.1 0 0.000 0.000 0 0.000 0.000 3 231627.3 14.49 188.880585 40.7357 -74.1724 10+ S 180 180 Clearest (>30 km) 2025-04-18 2025 4 21 April Apr 18 Friday Fri Apr 18 21:00:00 1970-01-01 21:00:00
2025-04-18 22:00:00 72.2 1 0.000 0.000 0 0.000 0.000 3 237204.7 15.05 174.882782 40.7357 -74.1724 10+ S 165 180 Clearest (>30 km) 2025-04-18 2025 4 22 April Apr 18 Friday Fri Apr 18 22:00:00 1970-01-01 22:00:00
2025-04-18 23:00:00 67.4 1 0.000 0.000 0 0.000 0.000 3 211286.1 14.24 171.869980 40.7357 -74.1724 10+ S 165 180 Clearest (>30 km) 2025-04-18 2025 4 23 April Apr 18 Friday Fri Apr 18 23:00:00 1970-01-01 23:00:00
2025-04-19 62.8 1 0.000 0.000 0 0.000 0.000 3 156168.0 10.33 175.030350 40.7357 -74.1724 10+ S 165 180 Clearest (>30 km) 2025-04-19 2025 4 0 April Apr 19 Saturday Sat Apr 19 00:00:00 1970-01-01
2025-04-19 01:00:00 60.2 1 0.000 0.000 0 0.000 0.000 3 115813.6 7.11 155.854462 40.7357 -74.1724 6-8 SE 150 135 Clearest (>30 km) 2025-04-19 2025 4 1 April Apr 19 Saturday Sat Apr 19 01:00:00 1970-01-01 01:00:00
2025-04-19 02:00:00 58.3 2 0.000 0.000 0 0.000 0.000 3 95800.5 5.16 162.349792 40.7357 -74.1724 4-6 S 150 180 Clearest (>30 km) 2025-04-19 2025 4 2 April Apr 19 Saturday Sat Apr 19 02:00:00 1970-01-01 02:00:00
2025-04-19 03:00:00 56.6 2 0.000 0.000 0 0.000 0.000 3 80380.6 4.41 156.037506 40.7357 -74.1724 4-6 SE 150 135 Clearest (>30 km) 2025-04-19 2025 4 3 April Apr 19 Saturday Sat Apr 19 03:00:00 1970-01-01 03:00:00
2025-04-19 04:00:00 56.5 2 0.000 0.000 0 0.000 0.000 3 73818.9 3.80 151.927612 40.7357 -74.1724 2-4 SE 150 135 Clearest (>30 km) 2025-04-19 2025 4 4 April Apr 19 Saturday Sat Apr 19 04:00:00 1970-01-01 04:00:00
2025-04-19 05:00:00 55.1 1 0.000 0.000 0 0.000 0.000 3 66929.1 3.80 118.072395 40.7357 -74.1724 2-4 SE 105 135 Clearest (>30 km) 2025-04-19 2025 4 5 April Apr 19 Saturday Sat Apr 19 05:00:00 1970-01-01 05:00:00
2025-04-19 06:00:00 55.1 2 0.000 0.000 0 0.000 0.000 3 60695.5 3.50 116.564987 40.7357 -74.1724 2-4 SE 105 135 Clearest (>30 km) 2025-04-19 2025 4 6 April Apr 19 Saturday Sat Apr 19 06:00:00 1970-01-01 06:00:00
2025-04-19 07:00:00 55.8 2 0.000 0.000 0 0.000 0.000 3 58398.9 3.98 141.842728 40.7357 -74.1724 2-4 SE 135 135 Clearest (>30 km) 2025-04-19 2025 4 7 April Apr 19 Saturday Sat Apr 19 07:00:00 1970-01-01 07:00:00
2025-04-19 08:00:00 54.7 1 0.000 0.000 0 0.000 0.000 3 56102.4 5.11 156.801392 40.7357 -74.1724 4-6 SE 150 135 Clearest (>30 km) 2025-04-19 2025 4 8 April Apr 19 Saturday Sat Apr 19 08:00:00 1970-01-01 08:00:00
2025-04-19 09:00:00 55.2 2 0.000 0.000 0 0.000 0.000 3 55774.3 4.94 174.805664 40.7357 -74.1724 4-6 S 165 180 Clearest (>30 km) 2025-04-19 2025 4 9 April Apr 19 Saturday Sat Apr 19 09:00:00 1970-01-01 09:00:00
2025-04-19 10:00:00 56.0 3 0.000 0.000 0 0.000 0.000 3 54461.9 5.88 188.746078 40.7357 -74.1724 4-6 S 180 180 Clearest (>30 km) 2025-04-19 2025 4 10 April Apr 19 Saturday Sat Apr 19 10:00:00 1970-01-01 10:00:00
2025-04-19 11:00:00 57.3 4 0.000 0.000 0 0.000 0.000 3 56758.5 7.36 199.536743 40.7357 -74.1724 6-8 S 195 180 Clearest (>30 km) 2025-04-19 2025 4 11 April Apr 19 Saturday Sat Apr 19 11:00:00 1970-01-01 11:00:00
2025-04-19 12:00:00 59.7 7 0.000 0.000 0 0.000 0.000 3 60367.5 7.60 193.627014 40.7357 -74.1724 6-8 S 180 180 Clearest (>30 km) 2025-04-19 2025 4 12 April Apr 19 Saturday Sat Apr 19 12:00:00 1970-01-01 12:00:00
2025-04-19 13:00:00 65.4 7 0.000 0.000 0 0.000 0.000 3 78740.2 12.75 201.614838 40.7357 -74.1724 10+ S 195 180 Clearest (>30 km) 2025-04-19 2025 4 13 April Apr 19 Saturday Sat Apr 19 13:00:00 1970-01-01 13:00:00
2025-04-19 14:00:00 70.0 10 0.000 0.000 0 0.000 0.000 3 94160.1 16.02 215.909821 40.7357 -74.1724 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 14 April Apr 19 Saturday Sat Apr 19 14:00:00 1970-01-01 14:00:00
2025-04-19 15:00:00 74.1 7 0.000 0.000 0 0.000 0.000 3 115157.5 17.88 226.520706 40.7357 -74.1724 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 15 April Apr 19 Saturday Sat Apr 19 15:00:00 1970-01-01 15:00:00
2025-04-19 16:00:00 69.0 10 0.016 0.016 0 0.000 0.000 51 57742.8 15.34 225.590576 40.7357 -74.1724 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 16 April Apr 19 Saturday Sat Apr 19 16:00:00 1970-01-01 16:00:00
2025-04-19 17:00:00 72.4 3 0.000 0.000 0 0.000 0.000 3 87926.5 15.43 209.538681 40.7357 -74.1724 10+ SW 195 225 Clearest (>30 km) 2025-04-19 2025 4 17 April Apr 19 Saturday Sat Apr 19 17:00:00 1970-01-01 17:00:00
2025-04-19 18:00:00 77.8 3 0.000 0.000 0 0.000 0.000 0 104330.7 19.46 223.602890 40.7357 -74.1724 10+ SW 210 225 Clearest (>30 km) 2025-04-19 2025 4 18 April Apr 19 Saturday Sat Apr 19 18:00:00 1970-01-01 18:00:00
2025-04-19 19:00:00 80.9 3 0.000 0.000 0 0.000 0.000 1 121391.1 20.78 235.967834 40.7357 -74.1724 10+ SW 225 225 Clearest (>30 km) 2025-04-19 2025 4 19 April Apr 19 Saturday Sat Apr 19 19:00:00 1970-01-01 19:00:00
source:
1 Date of the recorded data., 2 Temperature at 2 meters above ground., 3 Probability of precipitation., 4 Amount of precipitation., 5 Amount of rain., 6 Amount of showers., 7 Amount of snowfall., 8 Depth of snow., 9 Code representing the weather condition., 10 Visibility distance., 11 Wind speed at 10 meters above ground., 12 Wind direction at 10 meters above ground., 13 Vertical location coordinate., 14 Horizontal location coordinate., 15 Binned categories for wind speed., 16 Cardinal direction of the wind., 17 Binned categories for wind direction., 18 Numeric angle representing wind direction., 19 Categorized visibility levels., 20 Date without time, 21 Year extracted from the date., 22 Month extracted from the date., 23 Hour extracted from the date., 24 Name of the month., 25 Abbreviated name of the month., 26 Day extracted from the date., 27 Name of the weekday., 28 Abbreviated name of the weekday., 29 Combined month and day., 30 Time extracted from the date., 31 Common date format for time-based analysis.
Replace the forecast_data table; optionally, create an output preview object.
-- Replace the historical weather table
CREATE OR REPLACE TABLE forecast_data AS
SELECT * FROM transformed_forecast;

-- Preview results 
SELECT * FROM forecast_data LIMIT 10;
Drop transformation view.
DROP VIEW transformed_forecast;
Db cleanup
VACUUM forecast_data;

Dataset: Historical, 1974-2024

Modular SQL, in-database transformation
-- Create or replace the view with modular CTEs and explicit column lists
CREATE OR REPLACE VIEW transformed_historical AS
WITH cleaned_data AS (
SELECT
     date::TIMESTAMP AS date,
     ROUND(temperature_2m::FLOAT, 1) AS temperature_2m,
     ROUND(precipitation::FLOAT, 3) AS precipitation,
     ROUND(rain::FLOAT, 3) AS rain,
     ROUND(snowfall::FLOAT, 3) AS snowfall,
     ROUND(snow_depth::FLOAT, 3) AS snow_depth,
     weather_code AS weather_code,
     ROUND(wind_speed_10m::FLOAT, 2) AS wind_speed_10m,
     wind_direction_10m AS wind_direction_10m,
     latitude AS latitude,
     longitude AS longitude
FROM historical_data
),

transformed_data AS (
SELECT
     *,
-- Speed bin
CASE 
WHEN wind_speed_10m <= 2 THEN CAST('0-2' AS speed_bin_enum)
WHEN wind_speed_10m <= 4 THEN CAST('2-4' AS speed_bin_enum)
WHEN wind_speed_10m <= 6 THEN CAST('4-6' AS speed_bin_enum)
WHEN wind_speed_10m <= 8 THEN CAST('6-8' AS speed_bin_enum)
WHEN wind_speed_10m <= 10 THEN CAST('8-10' AS speed_bin_enum)
ELSE CAST('10+' AS speed_bin_enum)
END AS speed_bin,
-- Cardinal direction
CASE 
WHEN wind_direction_10m BETWEEN 0 AND 22.5 THEN CAST('N' AS cardinal_direction_enum)
WHEN wind_direction_10m BETWEEN 22.5 AND 67.5 THEN CAST('NE' AS cardinal_direction_enum)
WHEN wind_direction_10m BETWEEN 67.5 AND 112.5 THEN CAST('E' AS cardinal_direction_enum)
WHEN wind_direction_10m BETWEEN 112.5 AND 157.5 THEN CAST('SE' AS cardinal_direction_enum)
WHEN wind_direction_10m BETWEEN 157.5 AND 202.5 THEN CAST('S' AS cardinal_direction_enum)
WHEN wind_direction_10m BETWEEN 202.5 AND 247.5 THEN CAST('SW' AS cardinal_direction_enum)
WHEN wind_direction_10m BETWEEN 247.5 AND 292.5 THEN CAST('W' AS cardinal_direction_enum)
WHEN wind_direction_10m BETWEEN 292.5 AND 337.5 THEN CAST('NW' AS cardinal_direction_enum)
WHEN wind_direction_10m BETWEEN 337.5 AND 360 THEN CAST('N' AS cardinal_direction_enum)
ELSE NULL
END AS wind_direction_cardinal,
-- 15-degree direction bin (numeric)
FLOOR((wind_direction_10m - 1e-9) / 15) * 15 AS direction_bin
FROM cleaned_data
),

final_data AS (
SELECT
     *,
     -- Direction angle
     CASE
          WHEN wind_direction_cardinal = 'N' THEN 0
          WHEN wind_direction_cardinal = 'NE' THEN 45
          WHEN wind_direction_cardinal = 'E' THEN 90
          WHEN wind_direction_cardinal = 'SE' THEN 135
          WHEN wind_direction_cardinal = 'S' THEN 180
          WHEN wind_direction_cardinal = 'SW' THEN 225
          WHEN wind_direction_cardinal = 'W' THEN 270
          WHEN wind_direction_cardinal = 'NW' THEN 315
     ELSE NULL
     END AS direction_angle,
-- Date parts
strftime(date, '%m-%d-%Y') AS date_only,
EXTRACT(YEAR FROM date) AS year,
EXTRACT(MONTH FROM date) AS month,
EXTRACT(hour FROM date) AS hour,
monthname(date)::month_name_enum AS month_name,
strftime(date, '%b')::month_abb_enum AS month_abb,
EXTRACT(DAY FROM date) AS day,
dayname(date)::weekday_name_enum AS weekday_name,
strftime(date, '%a')::weekday_abb_enum AS weekday_abb,
strftime(date, '%b %d') AS month_day,
strftime(date, '%H:%M:%S') AS time_only,
strptime('1970-01-01 ' || strftime(date, '%H:%M:%S'), '%Y-%m-%d %H:%M:%S') AS common_date
FROM transformed_data
)

-- Final output
SELECT * FROM final_data;
Code
-- Final output
SELECT * FROM transformed_historical LIMIT 20;
table setup
r_df <- viewOfHistorical |>
dplyr::mutate(
     date = as.character(date),
     common_date = as.character(common_date)
)

locations_list = colnames(r_df)

notes_list <- c(
     "Date of the recorded data.",
     "Temperature at 2 meters above ground.",
     "Amount of precipitation.",
     "Amount of rain.",
     "Amount of snowfall.",
     "Depth of snow.",
     "Code representing the weather condition.",
     "Wind speed at 10 meters above ground.",
     "Wind direction at 10 meters above ground.",
     "Vertical location coordinate.",
     "Horizontal location coordinate.",
     "Cardinal direction of the wind.",
     "Binned categories for wind speed.",
     "Binned categories for direction angle.",
     "Numeric angle representing wind direction.",
     "Date without time",
     "Year extracted from the date.",
     "Month extracted from the date.",
     "Hour extracted from the date.",
     "Name of the month.",
     "Abbreviated name of the month.",
     "Day extracted from the date.",
     "Name of the weekday.",
     "Abbreviated name of the weekday.",
     "Combined month and day.",
     "Time extracted from the date.",
     "Common date format for time-based analysis."
)

footnotes_df <- tibble(
  notes = notes_list, 
  locations = locations_list
)

pal_df <- tibble(
  cols = locations_list,
  pals = list(eval_palette("grDevices::Rocket", 10 , 'c', 1))
)

rTable <- r_table_theming(
r_df,
title = "Historical Data Preview",
subtitle = NULL,
footnotes_df,
source_note = md("**source**: "),
pal_df,
footnotes_multiline = FALSE,
table_font_size = pct(70),
#do_col_labels = TRUE,
)
Table 5
Historical Data Preview
date1 temperature_2m2 precipitation3 rain4 snowfall5 snow_depth6 weather_code7 wind_speed_10m8 wind_direction_10m9 latitude10 longitude11 speed_bin12 wind_direction_cardinal13 direction_bin14 direction_angle15 date_only16 year17 month18 hour19 month_name20 month_abb21 day22 weekday_name23 weekday_abb24 month_day25 time_only26 common_date27
1974-01-01 05:00:00 50.2 0 0 0 0 3 3.39 97.59455 33.4484 -112.074 2-4 E 90 90 01-01-1974 1974 1 5 January Jan 1 Tuesday Tue Jan 01 05:00:00 1970-01-01 05:00:00
1974-01-01 06:00:00 48.1 0 0 0 0 2 4.03 93.17977 33.4484 -112.074 4-6 E 90 90 01-01-1974 1974 1 6 January Jan 1 Tuesday Tue Jan 01 06:00:00 1970-01-01 06:00:00
1974-01-01 07:00:00 45.5 0 0 0 0 1 4.92 90.00000 33.4484 -112.074 4-6 E 75 90 01-01-1974 1974 1 7 January Jan 1 Tuesday Tue Jan 01 07:00:00 1970-01-01 07:00:00
1974-01-01 08:00:00 44.2 0 0 0 0 2 4.72 84.55976 33.4484 -112.074 4-6 E 75 90 01-01-1974 1974 1 8 January Jan 1 Tuesday Tue Jan 01 08:00:00 1970-01-01 08:00:00
1974-01-01 09:00:00 43.2 0 0 0 0 3 4.56 78.69010 33.4484 -112.074 4-6 E 75 90 01-01-1974 1974 1 9 January Jan 1 Tuesday Tue Jan 01 09:00:00 1970-01-01 09:00:00
1974-01-01 10:00:00 42.5 0 0 0 0 2 4.72 84.55976 33.4484 -112.074 4-6 E 75 90 01-01-1974 1974 1 10 January Jan 1 Tuesday Tue Jan 01 10:00:00 1970-01-01 10:00:00
1974-01-01 11:00:00 41.9 0 0 0 0 1 4.97 82.23492 33.4484 -112.074 4-6 E 75 90 01-01-1974 1974 1 11 January Jan 1 Tuesday Tue Jan 01 11:00:00 1970-01-01 11:00:00
1974-01-01 12:00:00 41.6 0 0 0 0 0 5.05 102.80426 33.4484 -112.074 4-6 E 90 90 01-01-1974 1974 1 12 January Jan 1 Tuesday Tue Jan 01 12:00:00 1970-01-01 12:00:00
1974-01-01 13:00:00 41.1 0 0 0 0 0 5.00 116.56499 33.4484 -112.074 4-6 SE 105 135 01-01-1974 1974 1 13 January Jan 1 Tuesday Tue Jan 01 13:00:00 1970-01-01 13:00:00
1974-01-01 14:00:00 41.0 0 0 0 0 0 6.36 129.28938 33.4484 -112.074 6-8 SE 120 135 01-01-1974 1974 1 14 January Jan 1 Tuesday Tue Jan 01 14:00:00 1970-01-01 14:00:00
1974-01-01 15:00:00 41.3 0 0 0 0 1 6.67 129.55963 33.4484 -112.074 6-8 SE 120 135 01-01-1974 1974 1 15 January Jan 1 Tuesday Tue Jan 01 15:00:00 1970-01-01 15:00:00
1974-01-01 16:00:00 45.0 0 0 0 0 1 9.03 131.98714 33.4484 -112.074 8-10 SE 120 135 01-01-1974 1974 1 16 January Jan 1 Tuesday Tue Jan 01 16:00:00 1970-01-01 16:00:00
1974-01-01 17:00:00 53.6 0 0 0 0 1 8.63 148.78166 33.4484 -112.074 8-10 SE 135 135 01-01-1974 1974 1 17 January Jan 1 Tuesday Tue Jan 01 17:00:00 1970-01-01 17:00:00
1974-01-01 18:00:00 59.6 0 0 0 0 1 8.75 175.60138 33.4484 -112.074 8-10 S 165 180 01-01-1974 1974 1 18 January Jan 1 Tuesday Tue Jan 01 18:00:00 1970-01-01 18:00:00
1974-01-01 19:00:00 64.2 0 0 0 0 3 12.85 211.47679 33.4484 -112.074 10+ SW 210 225 01-01-1974 1974 1 19 January Jan 1 Tuesday Tue Jan 01 19:00:00 1970-01-01 19:00:00
1974-01-01 20:00:00 65.7 0 0 0 0 3 22.42 233.93050 33.4484 -112.074 10+ SW 225 225 01-01-1974 1974 1 20 January Jan 1 Tuesday Tue Jan 01 20:00:00 1970-01-01 20:00:00
1974-01-01 21:00:00 65.9 0 0 0 0 3 25.00 236.30991 33.4484 -112.074 10+ SW 225 225 01-01-1974 1974 1 21 January Jan 1 Tuesday Tue Jan 01 21:00:00 1970-01-01 21:00:00
1974-01-01 22:00:00 64.9 0 0 0 0 3 21.06 247.52052 33.4484 -112.074 10+ W 240 270 01-01-1974 1974 1 22 January Jan 1 Tuesday Tue Jan 01 22:00:00 1970-01-01 22:00:00
1974-01-01 23:00:00 63.3 0 0 0 0 3 19.52 265.39999 33.4484 -112.074 10+ W 255 270 01-01-1974 1974 1 23 January Jan 1 Tuesday Tue Jan 01 23:00:00 1970-01-01 23:00:00
1974-01-02 60.1 0 0 0 0 3 16.48 277.80008 33.4484 -112.074 10+ W 270 270 01-02-1974 1974 1 0 January Jan 2 Wednesday Wed Jan 02 00:00:00 1970-01-01
source:
1 Date of the recorded data., 2 Temperature at 2 meters above ground., 3 Amount of precipitation., 4 Amount of rain., 5 Amount of snowfall., 6 Depth of snow., 7 Code representing the weather condition., 8 Wind speed at 10 meters above ground., 9 Wind direction at 10 meters above ground., 10 Vertical location coordinate., 11 Horizontal location coordinate., 12 Cardinal direction of the wind., 13 Binned categories for wind speed., 14 Binned categories for direction angle., 15 Numeric angle representing wind direction., 16 Date without time, 17 Year extracted from the date., 18 Month extracted from the date., 19 Hour extracted from the date., 20 Name of the month., 21 Abbreviated name of the month., 22 Day extracted from the date., 23 Name of the weekday., 24 Abbreviated name of the weekday., 25 Combined month and day., 26 Time extracted from the date., 27 Common date format for time-based analysis.
Replace the historical weather table
CREATE OR REPLACE TABLE historical_data AS
SELECT * FROM transformed_historical;
Drop the view
DROP VIEW transformed_historical;
Refresh database statistics for the query planner
VACUUM historical_data;

Optimal Brokering

Create base_costs db table.
# Define base assumptions
base_costs <- tibble(
  parameter = c(
    "base_fuel_efficiency",  # Semi-truck average
    "fuel_price_per_gallon",
    "base_driver_wage", 
    "base_speed_mph",
    "base_toll_cost",
    "equipment_cost_per_mile",
    "profit_margin",
    "route_distance_miles"),
  value = c(6.5, 3.50, 25, 60, 50, 0.15, 0.20, 500)) |> 
  pivot_wider(names_from = parameter, values_from = value)

dbWriteTable(duckdb_con, "base_costs", base_costs)
     
query <- glue::glue_sql(
     "SELECT
          weather_code,
          description,
          fuel_multiplier,
          route_delay_factor,
          driver_wage_premium,
          toll_multiplier,
          equipment_wear_factor
     FROM weather_codes
     WHERE weather_code IN ({vals*});", 
     vals = c('0', '63', '75'), 
     .con = duckdb_con
     )

dbWriteTable(duckdb_con,  "weather_scenarios", dbGetQuery(duckdb_con, query))
In database calculations return hypothetical costs associated with a certain scenarios based on weather code data.
cost_calculation_query <- glue::glue_sql(.con = duckdb_con,
     "WITH cost_components AS (
     SELECT
          weather_code,
          description,
          -- Base calculations
          (route_distance_miles / base_fuel_efficiency) * fuel_price_per_gallon * fuel_multiplier AS raw_fuel,
          (route_distance_miles / (base_speed_mph / route_delay_factor)) * base_driver_wage * (1 + driver_wage_premium) AS raw_labor,
          route_distance_miles * equipment_cost_per_mile * equipment_wear_factor AS raw_equipment,
          base_toll_cost * toll_multiplier AS raw_toll,
          profit_margin
     FROM base_costs
     CROSS JOIN weather_scenarios
     )
     SELECT
          CONCAT(weather_code, ' (', description, ')') AS 'Scenario',
          ROUND(raw_fuel, 2) AS 'Fuel Cost',
          ROUND(raw_labor, 2) AS 'Labor Cost',
          ROUND(raw_equipment, 2) AS 'Equipment Cost',
          ROUND(raw_toll, 2) AS 'Toll Cost',
          ROUND(raw_fuel + raw_labor + raw_equipment + raw_toll, 2) AS 'Total Cost',
          ROUND((raw_fuel + raw_labor + raw_equipment + raw_toll) * (1 + profit_margin), 2) AS 'Brokerage Price'
     FROM cost_components;",
  .sep = "\n"
)

ccTable <- dbGetQuery(duckdb_con, cost_calculation_query)
table setup
locations_list = colnames(ccTable)

notes_list <- c(
     "Scenario" = "Weather conditions from WMO weather codes",
     "Fuel Cost" = "Calculated: (distance / efficiency) × fuel price × weather multiplier",
     "Labor Cost" = "Drive time × ($25/hr × (1 + wage premium)), where drive time = distance / (base speed / delay factor)",
     "Equipment Cost" = "Miles × $0.15/mile × equipment wear factor",
     "Toll Cost" = "Base toll × weather-adjusted toll multiplier",
     "Total Cost" = "Sum of all cost components before profit margin",
     "Brokerage Price" = "Total cost × 1.20 (20% profit margin)"
)

footnotes_df <- tibble(
  notes = notes_list, 
  locations = locations_list
)

pal_df <- tibble(
  cols = locations_list,
  pals = list(eval_palette("grDevices::RdYlGn", 10, 'c', -1))
)

rTable <- r_table_theming(
     ccTable,
     title = "Cost Breakdown by Weather Scenario",
     subtitle = NULL,
     footnotes_df,
     source_note = md("**source**: "),
     pal_df,
     footnotes_multiline = TRUE,
     table_font_size = pct(90),
     # do_col_labels = TRUE,
     target_everything = TRUE,
     color_by_columns = "Brokerage Price"
)
Table 6
Cost Breakdown by Weather Scenario
Scenario1 Fuel Cost2 Labor Cost3 Equipment Cost4 Toll Cost5 Total Cost6 Brokerage Price7
0 (Clear sky) 269.23 208.33 75.00 50 602.56 723.08
63 (Rain: moderate) 301.54 258.75 86.25 59 705.54 846.65
75 (Snow fall: heavy) 376.92 438.02 108.75 80 1003.69 1204.43
source:
1 Weather conditions from WMO weather codes
2 Calculated: (distance / efficiency) × fuel price × weather multiplier
3 Drive time × ($25/hr × (1 + wage premium)), where drive time = distance / (base speed / delay factor)
4 Miles × $0.15/mile × equipment wear factor
5 Base toll × weather-adjusted toll multiplier
6 Sum of all cost components before profit margin
7 Total cost × 1.20 (20% profit margin)
Create the scenario explanations tibble.
scenario_explanations <- tribble(
  ~Scenario, ~Key_Differences, ~Fuel_Impact, ~Labor_Impact, ~Equipment_Impact, ~Toll_Impact,
  "0 (Clear sky)", 
  "Baseline conditions with no weather penalties",
  "No multiplier (1.0). MPG at rated efficiency. No detours",
  "Full speed (60 mph). No wage premium. Standard hourly rate",
  "Standard wear rate ($0.15/mile). No corrosion/weather damage",
  "Base tolls only. No route adjustments",
  
  "63 (Rain: moderate)", 
  "Moderate weather penalties with reduced visibility",
  "12% increase (1.12x multiplier) From reduced MPG + minor detours",
  "24% increase (1.24x multiplier). Speed ↓33% to ~40 mph. 15% wage premium",
  "15% wear increase (1.15x multiplier). Wet road corrosion. Frequent brake use",
  "18% toll increase (1.18x multiplier). Alternate routes. Dynamic pricing",
  
  "75 (Snow fall: heavy)", 
  "Severe operational constraints",
  "40% increase (1.40x multiplier). Low traction MPG loss. Major detours",
  "110% increase (2.10x multiplier). Speed ↓78% to ~13 mph. 45% wage premium",
  "45% wear increase (1.45x multiplier). Salt/slush damage. Frequent part failures",
  "60% toll increase (1.60x multiplier). Mandatory snow routes. Peak pricing"
) |>
  mutate(Total_Cost_Increase = c(0, 17.1, 66.5))  # Percentage vs baseline
table setup
locations_list = colnames(scenario_explanations)

notes_list <- list(
  "Fuel multipliers from table, `weather_codes`, column `fuel_multiplier`",
  "Speed reductions calculated as: `base_speed_mph / route_delay_factor`",
  "Equipment wear factors account for corrosion (salt), particulate ingress, and mechanical stress",
  "Toll multipliers reflect real-time pricing adjustments from `reroute_api` column data",
  "Wage premiums follow OSHA hazard pay guidelines for transportation workers",
  "MPG calculations assume 80,000 lb GVWR at sea level with DEF consumption",
  "Dynamic pricing thresholds follow FHWA congestion management protocols"
)

footnotes_df <- tibble(
  notes = notes_list, 
  locations = locations_list
)

pal_df <- tibble(
  cols = locations_list,
  pals = list(eval_palette("grDevices::RdYlGn", 10, 'c', -1))
)

rTable <- r_table_theming(
scenario_explanations,
title = "Scenario Explanations",
subtitle = NULL,
footnotes_df,
source_note = md("**source**:"),
pal_df,
multiline_feet = TRUE,
table_font_size = pct(90),
target_everything = TRUE,
color_by_columns = "Total_Cost_Increase",
#row_name_col = "Model"
)
Table 7
Scenario Explanations
Scenario1 Key_Differences2 Fuel_Impact3 Labor_Impact4 Equipment_Impact5 Toll_Impact6 Total_Cost_Increase7
0 (Clear sky) Baseline conditions with no weather penalties No multiplier (1.0). MPG at rated efficiency. No detours Full speed (60 mph). No wage premium. Standard hourly rate Standard wear rate ($0.15/mile). No corrosion/weather damage Base tolls only. No route adjustments 0.0
63 (Rain: moderate) Moderate weather penalties with reduced visibility 12% increase (1.12x multiplier) From reduced MPG + minor detours 24% increase (1.24x multiplier). Speed ↓33% to ~40 mph. 15% wage premium 15% wear increase (1.15x multiplier). Wet road corrosion. Frequent brake use 18% toll increase (1.18x multiplier). Alternate routes. Dynamic pricing 17.1
75 (Snow fall: heavy) Severe operational constraints 40% increase (1.40x multiplier). Low traction MPG loss. Major detours 110% increase (2.10x multiplier). Speed ↓78% to ~13 mph. 45% wage premium 45% wear increase (1.45x multiplier). Salt/slush damage. Frequent part failures 60% toll increase (1.60x multiplier). Mandatory snow routes. Peak pricing 66.5
source:
1 Fuel multipliers from table, `weather_codes`, column `fuel_multiplier`
2 Speed reductions calculated as: `base_speed_mph / route_delay_factor`
3 Equipment wear factors account for corrosion (salt), particulate ingress, and mechanical stress
4 Toll multipliers reflect real-time pricing adjustments from `reroute_api` column data
5 Wage premiums follow OSHA hazard pay guidelines for transportation workers
6 MPG calculations assume 80,000 lb GVWR at sea level with DEF consumption
7 Dynamic pricing thresholds follow FHWA congestion management protocols

\[ \color{rgb(184, 52, 38)}{\text{Optimal Price} = \bigg(\sum_{}{Costs}\bigg)\times \big( 1 + \text{Profit Margin}\big)} \]

\[ \color{rgb(184, 52, 38)}{\text{Fuel Cost}=\frac{\text{Distance}}{\text{Fuel Efficiency}} \times \text{Fuel Price} \times \underbrace{\text{Fuel Multiplier}}_\text{Weather Multiplier}} \]

\[ \color{rgb(184, 52, 38)}{\text{Labor Cost}=\bigg( \frac{\text{Distance}}{\text{Base Speed}\ /\ \underbrace{\text{Delay Factor}}_\text{Weather Multiplier}}\bigg)\times \text{Hourly Wage}\times \big(1 + \text{Wage Premium}\big)} \]

\[ \color{rgb(184, 52, 38)}{\text{Toll Cost}=\text{Base Toll}\times \underbrace{\text{Toll Multiplier}}_\text{Weather Multiplier}} \]

\[ \color{rgb(184, 52, 38)}{\text{Equipment Cost} = \underbrace{\text{Distance}}_\text{miles} \times \underbrace{\text{Base Equipment Cost Rate}}_\text{\$/mile} \times \underbrace{\text{Equipment Wear Factor}}_\text{Weather multiplier}} \]

Estimating Route Delays (needs adjustment for real roads)

Forecast

Install and load DuckDB’s spatial library.
INSTALL spatial; LOAD spatial;
Contextualize weather data by linking codes to insights using in-database processing.
WITH routes AS (
  SELECT * FROM (
    VALUES
    (101, 38.748, -90.439, 40.7128, -74.0060, 280),
    (102, 40.7128, -74.0060, 34.0522, -118.2437, 220)
  ) AS t(route_id, start_lat, start_lon, end_lat, end_lon, distance_miles)
),

route_geometries AS (
  SELECT
    route_id,
    distance_miles,
    ST_MakeLine(
      ST_Point(start_lon, start_lat),
      ST_Point(end_lon, end_lat)
    ) AS route_line
  FROM routes
),

enhanced_forecast AS (
  SELECT
    *,
    ST_Point(longitude, latitude) AS forecast_point
  FROM forecast_data
),

route_weather_join AS (
  SELECT
    rg.route_id,
    rg.distance_miles,
    wc.*,
    ST_Distance(rg.route_line, ef.forecast_point) AS distance_from_route
  FROM route_geometries rg
  JOIN enhanced_forecast ef
    ON ST_Intersects(ST_Buffer(rg.route_line, 0.1), ef.forecast_point)
  JOIN weather_codes wc USING (weather_code)
)

SELECT
  route_id,
  MAX(severity) AS max_severity,
  SUM(risk_score) AS total_risk,
  AVG(fuel_multiplier) * distance_miles AS projected_fuel,
  SUM(risk_score * distance_miles / (60 * 10)) AS total_delay,
  COUNT(*) AS weather_points_impacted
FROM route_weather_join
GROUP BY route_id, distance_miles
ORDER BY route_id ASC;
table setup
locations_list = colnames(exampleOutput)

notes_list <- c(
  "Unique identifier for the transportation route",
  "Highest severity level of weather impacts along the route (Low/Moderate/International is committed to providing outstanding service. If you would like to provide feedback on or have High/Critical)",
  "Sum of all risk scores from weather events affecting the route",
  "Estimated total fuel consumption adjusted for weather multipliers",
  "Cumulative delay time (hours) due to weather-related speed reductions",
  "Number of geographic points along the route affected by adverse weather"
)

footnotes_df <- tibble(
  notes = notes_list, 
  locations = locations_list)

pal_df <- tibble(
  cols = locations_list
#  pals = list(eval_palette("viridis::viridis", 2, 'c', 1))
)

rTable <- r_table_theming(
exampleOutput,
title = "Experimental Route Attributes",
subtitle = NULL,
footnotes_df,
source_note = md("**source**: "),
pal_df,
multiline_feet = TRUE,
table_font_size = pct(95),
target_everything = TRUE,
#row_name_col = "route_id",
)
Table 8
Experimental Route Attributes
route_id1 max_severity2 total_risk3 projected_fuel4 total_delay5 weather_points_impacted6
101 Moderate 15.95 296.66 7.443333 60
102 High 23.95 227.04 8.781667 120
source:
1 Unique identifier for the transportation route
2 Highest severity level of weather impacts along the route (Low/Moderate/International is committed to providing outstanding service. If you would like to provide feedback on or have High/Critical)
3 Sum of all risk scores from weather events affecting the route
4 Estimated total fuel consumption adjusted for weather multipliers
5 Cumulative delay time (hours) due to weather-related speed reductions
6 Number of geographic points along the route affected by adverse weather

Spatial Representation

Convert coordinates into geometric objects:

\(\color{rgb(184, 52, 38)}{Routes\to LineStrings}\)

\(\color{rgb(184, 52, 38)}{Forecast\ Points\to Points}\) \(\color{gray}{\text{ where:}}\) \(\color{rgb(184, 52, 38)}{LineString\small_R\normalsize=ST\_MakeLine(ST\_Point(start),\ ST\_Point(end))}\) \(\color{rgb(184, 52, 38)}{Point(F)=ST\_Point(longitude,\ latitude)}\)

\({\textbf{R}}\) - Route definition (tuple of start/end coordinates)

\({\textbf{LineString(R)}}\) - Linear geometry connecting route endpoints, generated by:

\(\color{gray}{ST\_MakeLine(ST\_Point(start_{Lon},\ start_{Lat}),\ ST\_Point(end_{Lon},\ end_{Lat}))}\)

\({\textbf{F}}\) - Raw forecast data point (from API)

\({\textbf{Point(F)}}\) - Geometric point representing weather observation, generated by:

\(\color{gray}{\ ST\_Point(longitude,\ latitude))}\)

\({\textbf{start, end}}\) - Route endpoints (latitude/longitude pairs)

\({\textbf{ST\_Point}}\) - DuckDB function converting coordinates to points

\({\textbf{ST\_MakeLine}}\) - DuckDB function creating route lines

Risk Aggregation

Summarize impacts per route:

\(\color{rgb(184, 52, 38)}{Total\ Risk_R=\sum{risk\_score}^{}}\)

\(\color{rgb(184, 52, 38)}{Max\ Severity\small_R\normalsize=max(severity)}\)

\(\color{rgb(184, 52, 38)}{Fuel\ Impact_R=distance\ \times \ \overline{fuel\_multiplier}}\)

\(\color{rgb(184, 52, 38)}{Delay\small_R\normalsize=\left(\frac{distance}{60}\ \times\ route\_delay\right)\ +\ border\_delays}\)

\({\textbf{R}}\) - Route definition (tuple of start/end coordinates)

Spatial Filtering

Identify weather impacts along routes:

\(\color{rgb(184, 52, 38)}{Impacted\ Points=\{F\ |\ ST\_Intersects(ST\_Buffer(LineString(R),\ Point(F))\}}\)

\({\textbf{F}}\) - Weather forecast points

\({\textbf{R}}\) - Route geometry

\({\textbf{ST\_Buffer}}\) - Expands route line by 0.1 degr. (~11 km at equator)

Simplified Pipeline

\[ \color{rgb(184, 52, 38)}{Raw\ Forecast\overset{Spatialize}{\longrightarrow}Points\overset{Intersect\ Routes}{\longrightarrow}Filtered\ Data\overset{Aggregate}{\longrightarrow}Risk\ Metrics} \]

The workflow transforms raw coordinates into route risk profiles using spatial relationships and weighted averages.

Historical EDA

Parameterized SQL Aggregation Function Examples

Full parameterization using a glue_sql template
glue_sql_mean <- function(con,
                     group_cols,
                     transformation_col,
                     metric_col,
                     from_tbl) {
     # Create parameterized query with glue_sql
     query <- glue::glue_sql("
     SELECT
          {`group_cols`*}
          ,AVG({`transformation_col`}) AS {`metric_col`}
     FROM {`from_tbl`}
     GROUP BY {`group_cols`*}
     ORDER BY {`group_cols`*}
     ", .con = con)
     return(dbGetQuery(con, query))
}

glue_sql_sum <- function(con,
                     group_cols,
                     transformation_col,
                     metric_col,
                     from_tbl) {
     query <- glue::glue_sql("
     SELECT
          {`group_cols`*}
          ,SUM({`transformation_col`}) AS {`metric_col`}
     FROM {`from_tbl`}
     GROUP BY {`group_cols`*}
     ORDER BY {`group_cols`*}
     ", .con = con)
     return(dbGetQuery(con, query))
}

glue_sql_count <- function(con,
                     group_cols,
                     transformation_col,
                     metric_col,
                     from_tbl) {
     query <- glue::glue_sql("
     SELECT
          {`group_cols`*}
          ,COUNT({`transformation_col`}) AS {`metric_col`}
     FROM {`from_tbl`}
     GROUP BY {`group_cols`*}
     ORDER BY {`group_cols`*}
     ", .con = con)
     return(dbGetQuery(con, query))
}
Testing sql aggregate functions.
# Define parameters
group_cols <- c("year", "month")
transformation_col <- "temperature_2m"
metric_col <- "avg_temp"
from_tbl <- "historical_data"

mean_data <- glue_sql_mean(
     duckdb_con, 
     group_cols, 
     transformation_col, 
     metric_col, 
     from_tbl
     )

# Define parameters
transformation_col <- "rain"
metric_col <- "sum_rain"

sum_data <- glue_sql_sum(
     duckdb_con, 
     group_cols, 
     transformation_col, 
     metric_col, 
     from_tbl
     )

transformation_col <- "weekday_name"
metric_col <- "count_weekdays"
group_cols <- c("year", "month", "weekday_abb")

count_data <- glue_sql_count(
     duckdb_con, 
     group_cols, 
     transformation_col, 
     metric_col, 
     from_tbl
)

Test Stats Visuals

ANOVA for categorical (e.g., weather_code) to continuous data (e.g., temperature, precipitation)

Historical relationship between temperature and weather code data.
# Example: Weather code vs temperature
temp_weather_code <- tbl(duckdb_con, "historical_data") |> 
     select(temperature_2m, weather_code) |>
     dplyr::collect() 

# anova_temp <-aov(temperature_2m ~ weather_code, data = temp_weather_code)

# summary(anova_temp)
Figure 1

Forecast Plot Testing

Create a plot list for wind roses
base_path = "data/plots/"
plot_wind_rose_ggplot(duckdb_con)
fileList <-list.files(base_path, pattern = "^wind_rose")
(a) Weather Codes
(b) Freezing/Non-Freezing Temperature
(c) Visibility (km)
(d) Visibility Categories
(e) Precipitation (empty if no precipitation)
(f) Wind Rose1
(g) Wind Rose2
Figure 2: These are the grouped figures.

Disconnect From Databases

Dereference memory from the in-memory database connections.
dbDisconnect(duckdb_con)